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
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:
J. R. Caldas Pinto, J. M. da Costa Sousa 313
Exemplo
a = 1 2 3 4 5 6 7 8 >> size(a) ans = 2 4J. 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
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
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
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)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
J. R. Caldas Pinto, J. M. da Costa Sousa 323
Operadores aritméticos
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
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
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
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);
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
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)
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.
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!
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);
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');
J. R. Caldas Pinto, J. M. da Costa Sousa 345
Tipos de saída
J. R. Caldas Pinto, J. M. da Costa Sousa 346
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
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)]);
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)
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:
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);