• Nenhum resultado encontrado

MATLAB. Tópicos Elementares. 1. Tipos de dados: vectores e matrizes 2. Operadores 3. Controlo de Fluxo

N/A
N/A
Protected

Academic year: 2021

Share "MATLAB. Tópicos Elementares. 1. Tipos de dados: vectores e matrizes 2. Operadores 3. Controlo de Fluxo"

Copied!
24
0
0

Texto

(1)

MATLAB

Tópicos Elementares

J. R. Caldas Pinto, J. M. da Costa Sousa 310

Sumário

1.

Tipos de dados: vectores e matrizes

2.

Operadores

3.

Controlo de Fluxo

a. Operadores de selecção

b. Operadores de repetição

4.

Funções em Matlab

5.

Leitura e escrita de dados

(2)

J. R. Caldas Pinto, J. M. da Costa Sousa 311

Tipos de dados em Matlab

Vectores e Matrizes no Matlab

‰

No Matlab o objecto básico é a matriz cujo tipo pode

ser qualquer um dos vistos atrás.

‰

Todas as operações, em geral reservadas a variáveis,

são aplicáveis a matrizes. As matrizes são

caracterizadas pelo seu número de linhas e colunas,

dado pela função size.

‰

Tipo por defeito: double

‰

Definição de uma variável do tipo inteiro com 8 bits:

(3)

J. R. Caldas Pinto, J. M. da Costa Sousa 313

Exemplo

a = 1 2 3 4 5 6 7 8 >> size(a) ans = 2 4

J. R. Caldas Pinto, J. M. da Costa Sousa 314

Vectores e matrizes

‰Vectores: são matrizes n×1 ou 1×n.

‰Construção de Matrizes e Vectores

¾k=0:1:20; % vector com elementos de 0 a 20

¾a =ones(2,3); ¾b=zeros(3,4); ¾c=eye(3); ¾d=rand(3,4); ¾e=randn(3,4); ¾f=repmat(A,2,4) ƒ Concatenação: >> a=[1; 2] >> b=[1 3; 5 7]; >> c=[7 8 9]; >> A=[a b;c] A = 1 1 3 2 5 7 7 8 9

(4)

J. R. Caldas Pinto, J. M. da Costa Sousa 315

Manipulação de matrizes

‰Acesso aos elementos de matrizes

ƒ Podem ser acedidos individualmente, em grupo, ou com um único índice, tendo em conta que as matrizes são guardadas por colunas. A = 1 1 3 2 5 7 7 8 9 >> b=A(1:2,2:3) b = 1 3 5 7 >> c=A(:,2:3) b = 1 3 5 7 8 9 >> d=A(6) d = 8

Manipulação de matrizes

‰Apagar linhas ou colunas de uma matriz

ƒ Usa-se um par de parêntesis rectos

¾X = A;

ƒ Para apagar a segunda coluna de X:

¾X(:,2)=[];

‰Selecção através de variáveis lógicas

ƒ Um vector numérico com zeros e valores diferentes de zero pode transformar-se em vector de variáveis lógicas

A = 6 4 0 0 5 7 7 0 9 >> logical(A) A = 1 1 0 0 1 1

(5)

J. R. Caldas Pinto, J. M. da Costa Sousa 317

Trocar colunas e selecção elementos

‰

Trocar colunas:

¾A = B(:,[1 3 2 4])

‰Selecção de elementos de uma matriz: A = 1 4 7 2 5 8 3 6 9 >> B = A > 5 B = 0 0 1 0 0 1 0 1 1 >> A(B) ans = 6 7 8 9

J. R. Caldas Pinto, J. M. da Costa Sousa 318

Procura e testes

‰

A instrução find permite encontrar as posições em

termos de colunas que obedecem a dada condição:

¾k = find(isprime(A)) % isprime: 1 se for primo

¾k = find(A>5)

‰

Testes à classe de objectos (não aos seus elementos):

¾islogical

¾ischar

¾isstruct

¾isnumeric

(6)

J. R. Caldas Pinto, J. M. da Costa Sousa 319

Espaço em memória

‰

As matrizes são escritas em memória coluna a coluna.

‰

Há permanente alocação dinâmica de memória embora

se possa reservar espaço (criando uma matriz inicial

com a dimensão máxima que pode ser atingida). Neste

caso diz-se que a alocação é estática.

‰

Uma matriz pode crescer atribuindo novos valores.

Contudo não podem ser usados pontos não definidos.

‰

Libertação de espaço de memória:

ƒ Quando uma matriz de grandes dimensões deixa de ser utilizada, deve ser utilizada a instrução clear.

Exemplo

>> d=repmat(5,2,4) d = 5 5 5 5 5 5 5 5 >> d(3,1)=6 d = 5 5 5 5 5 5 5 5 6 0 0 0 >> a=d(5,1)

(7)

J. R. Caldas Pinto, J. M. da Costa Sousa 321

Arrays de caracteres (char)

‰Esta subclasse de objectos difere dos arrays numéricos pelo conjunto de métodos que lhe estão associados.

‰Exemplo:

¾a=[‘TAI’];

¾ischar(a); retorna 1

¾size(char); retorna [1 3]

¾blanks(n) é uma string com n espaços em branco

¾disp(blanks(n)') move o cursor n linhas para baixo.

¾disp(['xxx' blanks(20) 'yyy'])

¾S = char(T1,T2,T3,..) forma um array de caracteres S contendo as strings T1,T2,T3,... como linhas.

J. R. Caldas Pinto, J. M. da Costa Sousa 322

Funções associadas a strings

C a t e g o r y F u n c t i o n D e s c r i p t i o n b l a n k s S t r i n g o f b l a n k s c e l l s t r C r e a t e c e l l a r r a y o f s t r i n g s f r o m c h a r a c t e r a r r a y c h a r C r e a t e c h a r a c t e r a r r a y ( s t r i n g ) d e b l a n k R e m o v e t r a i l i n g b l a n k s G e n e r a l e v a l E x e c u t e s t r i n g w i t h M A T L A B e x p r e s s i o n i s c e l l s t r T r u e f o r c e l l a r r a y o f s t r i n g s i s c h a r T r u e f o r c h a r a c t e r a r r a y i s l e t t e r T r u e f o r l e t t e r s o f a l p h a b e t . S t r i n g T e s t s i s s p a c e T r u e f o r w h i t e s p a c e c h a r a c t e r s . f i n d s t r F i n d o n e s t r i n g w i t h i n a n o t h e r l o w e r C o n v e r t s t r i n g t o l o w e r c a s e s t r c a t C o n c a t e n a t e s t r i n g s s t r c m p C o m p a r e s t r i n g s s t r c m p i C o m p a r e s t r i n g s , i g n o r i n g c a s e s t r j u s t J u s t i f y s t r i n g s t r m a t c h F i n d m a t c h e s f o r s t r i n g s t r n c m p C o m p a r e f i r s t N c h a r a c t e r s o f s t r i n g s s t r n c m p i C o m p a r e f i r s t N c h a r a c t e r s , i g n o r i n g c a s e s t r r e p R e p l a c e s t r i n g w i t h a n o t h e r s t r t o k F i n d t o k e n i n s t r i n g s t r v c a t C o n c a t e n a t e s t r i n g s v e r t i c a l l y S t r i n g O p e r a t i o n s u p p e r C o n v e r t s t r i n g t o u p p e r c a s e

(8)

J. R. Caldas Pinto, J. M. da Costa Sousa 323

Operadores aritméticos

(9)

J. R. Caldas Pinto, J. M. da Costa Sousa 325

Funções lógicas

‰

xor – ou exclusivo.

‰

all – retorna 1 se todos os elementos do vector têm o

valor true ou são todos não nulos. Este operador

opera coluna a coluna em matrizes.

‰

any – retorna 1 se qualquer elemento do vector tem o

valor true ou é não nulo. Caso contrário retorna zero.

Este operador opera coluna a coluna em matrizes.

¾

i = find(A > 8);

¾

A(i) = 100

ƒ i é um vector com os índices onde A é maior que 8. O vector i é preenchido coluna a coluna.

J. R. Caldas Pinto, J. M. da Costa Sousa 326

Controlo de fluxo

‰

Operadores de selecção

ƒ

if, else, and elseif

ƒ

if avalia uma expressão lógica e executa um grupo de

instruções baseadas no valor da expressão. Forma mais

simples:

if logical_expression

statements

(10)

J. R. Caldas Pinto, J. M. da Costa Sousa 327

If com matrizes vazias

‰

Uma matriz vazia retorna falso.

™

Exemplo:

if A S1 else S0 end

ƒ

executa a instrução S0 se A for uma matriz vazia.

Instrução switch

‰switch executa as instruções baseadas num valor da variável ou expressão. É equivalente ao CASE em Fortran90.

switch expressão (escalar ou string) case valor1

instruções % Executa se expressão é valor1

case valor2

instruções % Executa se expressão é valor2

...

otherwise

instruções %Executa se todos os valori não se verificarem

(11)

J. R. Caldas Pinto, J. M. da Costa Sousa 329

Instrução while

‰

O ciclo while executa as instruções enquanto a

expressão de controlo for verdadeira (1).

while expressão,

instruções

end

J. R. Caldas Pinto, J. M. da Costa Sousa 330

Instrução for

‰

O ciclo for executa as instruções um pré-determinado

número de vezes.

for índice = início:incremento:fim,

instruções

(12)

J. R. Caldas Pinto, J. M. da Costa Sousa 331

Arrays como índices

‰Os índices de um ciclo for podem ser arrays. Considere-se uma array A m×n:

™A instrução for i = A,

instruções end

‰atribui a i o vector A(:,k). Na primeira iteração, k é igual a 1; na segunda iteração k é igual a 2, etc., até que k é igual a n.

‰Ou seja, o ciclo é repetido o número de vezes igual ao número de colunas de A. Em cada iteração, i é um vector contendo uma das colunas de A.

Vectorização de ciclos

‰Os ficheiros de código .m podem ser acelerados através da vectorização, ou seja, conversão de ciclos em operações com vectores e matrizes.

™Exemplo: Cálculo do seno de 1001 valores entre 0 e 10.

i = 0;

for t = 0:.01:10, i = i+1;

y(i) = sin(t); end

‰A forma vectorizada do mesmo código é dada por:

t = 0:0.01:10; y = sin(t);

(13)

J. R. Caldas Pinto, J. M. da Costa Sousa 333

Intruções return e break

‰

return

ƒ return termina a sequência de comandos a ser executada e devolve o controlo à função anterior ou ao teclado.

‰

break

ƒ A instrução break termina a execução de um ciclo for ou while. A execução continua com a primeira instrução fora do ciclo.

ƒ Em ciclos encadeados, break acaba apenas com o ciclo mais interior.

J. R. Caldas Pinto, J. M. da Costa Sousa 334

(14)

J. R. Caldas Pinto, J. M. da Costa Sousa 335

Sintaxe de funções

‰

Se a função retorna mais de um valor:

[out1, out2, ..., outN] = nome_funcao(in1, in2, ..., inN)

‰

Uma função que retorna apenas um valor tem o

seguinte aspecto:

out = nome_funcao(in1, in2, ..., inN)

(15)

J. R. Caldas Pinto, J. M. da Costa Sousa 337

Testes ao nº de argumentos

‰As funções nargin e nargout permitem determinar o número de argumentos de entrada e de saída.

‰Podem ser utilizadas condições para realizar acções dependendo do número de argumentos.

‰A ordem em que os argumentos é importante. O argumento a retornar aparece no ínicio, e os opcionais no fim da lista.

™Exemplo: function c = testa_argumentos(a,b) if (nargin ==1) c=a.^2; elseif (nargin ==2 c=a+b; end

J. R. Caldas Pinto, J. M. da Costa Sousa 338

Sub-funções

‰

Os M-files de funções podem conter mais de uma

função. A função primária é a principal, ou seja, a que

é invocada pelo nome do ficheiro M-file.

‰

As funções adicionais no ficheiro são sub-funções, e

só são visíveis pela função primária, ou por outras

sub-funções no mesmo ficheiro.

‰

Cada sub-função começa pela sua linha de definição,

estão umas a seguir às outras. A ordem das

sub-funções é opcional, mas a função primária deve

aparecer em primeiro lugar.

(16)

J. R. Caldas Pinto, J. M. da Costa Sousa 339

Exemplo de sub-funções

function [avg,med] = newstats(u) % Primary function % NEWSTATS Find mean and median with internal functions. n = length(u);

avg = mean(u,n); med = median(u,n);

function a = mean(v,n) % Subfunction Calculate average.

a = sum(v)/n;

function m = median(v,n) % Subfunction Calculate median w = sort(v); if rem(n,2) == 1 m = w((n+1)/2); else m = (w(n/2)+w(n/2+1))/2; end

Funções privadas

‰

As funções privadas estão em sub-directorias com o

nome de private. Estas funções só são visíveis nas

funções da directoria de raíz (parent directory).

‰

Estas directorias com o nome específico de private

podem ser criadas pelo programador, utilizando os

procedimentos habituais de criação de directorias ou

folders no computador.

‰

Estas directorias private não devem ser colocadas

na path!

(17)

J. R. Caldas Pinto, J. M. da Costa Sousa 341

Leitura de dados do ecrã

% Exemplo de entrada de valores num % programa em Matlab

i = input('Enter a integer number:') f = input('Enter a float number:') st = input('Enter a string :','s')

J. R. Caldas Pinto, J. M. da Costa Sousa 342

Escrita de dados em ficheiros

% Exemplo da escrita de valores numa file em matlab i=2;

f=4.5; texto='TAI';

filename = input(‘Insira o nome do ficheiro :','s') fid = fopen(filename,'w');

fprintf(fid,'%4d \n',i); fprintf(fid,'%5.2f \n',f); fprintf(fid,'%s \n',texto); fclose(fid);

(18)

J. R. Caldas Pinto, J. M. da Costa Sousa 343

Escrita de dados em ficheiros

‰Escrita de resultados de cálculo em ficheiros de texto.

ƒ Neste caso torna-se prático passar esses resultados para texto e ligá-los a outras mensagens. O Matlab usa as seguintes funções para o efeito:

¾int2str

¾num2str

¾sprintf

‰O nome do ficheiro pode reflictir determinados cálculos e ser colocado numa dada directoria. A função strcat pode ser usada para o efeito:

¾ fich=strcat(‘Res',int2str(a),‘_',int2str(b),'.txt');

(19)

J. R. Caldas Pinto, J. M. da Costa Sousa 345

Tipos de saída

J. R. Caldas Pinto, J. M. da Costa Sousa 346

(20)

J. R. Caldas Pinto, J. M. da Costa Sousa 347

Escrita de dados em ficheiros ascii

x=[1 2 3 4 5 6];

filename = input(‘Insira o nome do ficheiro :','s') fid = fopen(filename,'w');

fprintf(fid,'%4d \n',length(x)); % length da’ para

% vectores linha ou coluna for i =1:length(x), fprintf(fid,'%4d',x(i)); fprintf(fid,'\n'); end fclose(fid); 6 1 2 3 4 5 6

Exemplo com matrizes

x=[1 2 3; 4 5 6]; dim=size(x);

filename = input(‘Insira o nome do ficheiro :','s'); fid = fopen(filename,'w');

fprintf(fid,'%4d \n %4d \n',dim(1),dim(2)); %no. linhas e colunas for i =1:dim(1), fprintf(fid,'%4d',x(i,:)); fprintf(fid,'\n'); end fclose(fid); 2 3 1 2 3 4 5 6

(21)

J. R. Caldas Pinto, J. M. da Costa Sousa 349

Leitura de dados em ficheiros ascii

¾ [A,count] = fscanf(fid,format,size)

ƒ Lê dados do ficheiro fid, converte-os de acordo com o format, e retorna a matriz A. count é um argumento opcional que retorna o número de elementos lidos.

% Este exemplo destina-se a ilustrar o uso de fscanf de forma simples % Pretende-se ler dados numa file que sabemos corresponder a um vector % O primeiro elemento da file corresponde ao o número de elementos do % vector e os restantes estao dispostos em coluna

% Os elementos vão ser lidos como double % Abertura da file para leitura

filename = input(‘Insira o nome do ficheiro :','s') fio=fopen(filename,'r');

dim=fscanf(fio,'%4d ',1); % numero de elementos xvec=fscanf(fio,'%5f',dim); fclose(fio); xvec xvec = 1 2 3 4 5 6

J. R. Caldas Pinto, J. M. da Costa Sousa 350

Leitura de matrizes

‰Pretende-se ler dados num ficheiro onde:

ƒ o primeiro e segundo elemento são o nº de linhas e de colunas.

ƒ Os restantes elementos estão dispostos linha a linha

ƒ Os dados são reais do tipo double. % Abertura de ficheiro para leitura

filename = input(‘Insira o nome do ficheiro :','s') fio=fopen(filename,'r');

size=fscanf(fio, '%4d ',[2 1]); % numero de linhas e colunas xmat=fscanf(fio, '%5f',[size(2),size(1)]);

(22)

J. R. Caldas Pinto, J. M. da Costa Sousa 351

Leitura genérica

‰Leitura de dados não estruturados em ficheiros tipo txt. Dados dos quais nada se conhece e que podem diferir de linha para linha.

filename = 'dados.txt'; fid = fopen(filename, 'rt'); i = 1;

while (feof(fid) == 0)

a{i}=fgetl(fid); % lê a linha para um string i=i+1; % uso duma cell a estudar à frente end

fclose(fid);

Ex: Geração e Leitura de Imagens

‰

Manipulação de Imagens

¾

Imagem: matriz de M linhas e N colunas, com

elementos que dependem do tipo de imagem.

ƒ Imagens a cinzento

ƒ Imagens binárias

ƒ Imagens a cores

‰

Criação de Imagens

ƒ No Matlab ou num programa qualquer de aquisição e processamento de imagem (ex: Paint Shop Pro)

(23)

J. R. Caldas Pinto, J. M. da Costa Sousa 353

Imagem em Matlab

ima2=ones(80,100)*255;

ima2(30:60, 30:80)=0; % seja um rectangulo interior imshow(ima2) imwrite(ima2, 'imagem02.tif'); dim2=size(ima2); fid = fopen('temp02.txt','w'); fprintf(fid,'%4d \n %4d \n',dim2(1:2)); for i=1:dim2(1), fprintf(fid,'%4d',ima2(i,:)); fprintf(fid,'\n'); end fclose(fid);

‰

Gravar no ficheiro ascii temp02.txt

J. R. Caldas Pinto, J. M. da Costa Sousa 354

Criação de imagem em bitmap

% Leitura para uma matriz de uma imagem em bitmap ima1=imread('Imagem02.bmp');

dim=size(ima1); %dimensao da imagem imshow(ima1) % Visualizaçao em matlab:

(24)

J. R. Caldas Pinto, J. M. da Costa Sousa 355

Gravar imagens

‰A imagem criada deve ser convertida para double antes de ser escrita no ficheiro.

‰Existe uma grande variedade de possibilidades de ler imagens em Matlab.

% Colocar a imagem num ficheiro ascii ima1t=double(ima1); % para usar fprintf fid = fopen('temp03.txt','w'); fprintf(fid,'%4d \n%4d \n',dim(1:2)); for i=1:dim(1), fprintf(fid,'%4d',ima1t(i,:)); fprintf(fid,'\n'); end fclose(fid);

Referências

Documentos relacionados

III – A Bandeira, conduzida pelo Porta – Bandeira e escoltada pelo Guarda de Honra, constituída pelo Mestre de cerimônias e mais dois Mestres Maçons, armados de espada, adentra

Com base neste capital de experiência acumulado, bem como na relação de con- fiança e de trabalho em parceria cimentado ao longo daquelas experiências entre a Sol do Ave e o

 Não será permitida conversa entre candidatos durante a realização da prova e entre o candidato e qualquer outra pessoa no caso de prova eletrônica remota individual;  Não

As frequências alélicas HPA variam muito entre grupos populacionais, e, portanto, a seleção de doadores genotipados para os principais polimorfismos dos

Se errar, será concedida uma nova chance para que as demais equipes acionem seu sinal luminoso ao tempo determinado pelo(a) apresentador(a), e assim

Nota: sempre que, nos cálculos intermédios, proceder a arredondamentos, conserve, no mínimo, duas casas decimais. Cada ser vivo tem uma quantidade constante de carbono 14. Dado que

início da cobertura e antes de adquiri-lo:  Deve apresentar aspecto masculino;.  Isento

O comportamento da frequência da rede elétrica durante a conexão das cargas é avaliado para diferentes valores da constante de inércia do gerador e da constante de