MATLAB Tópicos Elementares 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 6. Exemplo: Geração e leitura de imagens J. R. Caldas Pinto, J. M. da Costa Sousa 310 1
Tipos de dados em Matlab J. R. Caldas Pinto, J. M. da Costa Sousa 311 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: x=int8(100); J. R. Caldas Pinto, J. M. da Costa Sousa 312 2
Exemplo a = 1 2 3 4 5 6 7 8 >> size(a) ans = 2 4 J. R. Caldas Pinto, J. M. da Costa Sousa 313 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) >> a=[1; 2] Concatenação: >> 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 314 3
Manipulação de matrizes Acesso aos elementos de matrizes Podem ser acedidos individualmente, em grupo, ou com um único índice, to 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 J. R. Caldas Pinto, J. M. da Costa Sousa 315 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 1 0 1 J. R. Caldas Pinto, J. M. da Costa Sousa 316 4
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 317 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 iscell J. R. Caldas Pinto, J. M. da Costa Sousa 318 5
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. J. R. Caldas Pinto, J. M. da Costa Sousa 319 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)??? Index exceeds matrix dimensions. J. R. Caldas Pinto, J. M. da Costa Sousa 320 6
Arrays de caracteres (char) Esta subclassedeobjectos 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 conto as strings T1,T2,T3,... como linhas. J. R. Caldas Pinto, J. M. da Costa Sousa 321 Funções associadas a strings C a te g o r y F u n c t io n D escription G e n e r a l b l a n k s String of blanks c e l l s t r C reate cell array of strings from character array c h a r C reate character array (string) d e b l a n k R em ove trailing blanks e v a l E x e c u te s trin g w ith M A T L A B e x p re s s io n S tring Tests i s c e l l s t r True for cell array of strings i s c h a r T ru e fo r c h a ra c te r a rra y i s l e t t e r True for letters of alphabet. i s s p a c e True for whitespace characters. String O perations f i n d s t r Find one string within another l o w e r C o n v e rt s trin g to lo w e rc a s e s t r c a t C oncatenate strings s t r c m p C om pare strings s t r c m p i C om pare strings, ignoring case s t r j u s t Justify string s t r m a t c h Find m atches for string s t r n c m p C om pare first N characters of strings s t r n c m p i C om pare first N characters, ignoring case s t r r e p R eplace string with another s t r t o k Find token in string s t r v c a t C oncatenate strings vertically u p p e r C onvert string to uppercase J. R. Caldas Pinto, J. M. da Costa Sousa 322 7
Operadores aritméticos J. R. Caldas Pinto, J. M. da Costa Sousa 323 Operadores relacionais e lógicos J. R. Caldas Pinto, J. M. da Costa Sousa 324 8
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 325 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 326 9
If com matrizes vazias Uma matriz vazia retorna falso. Exemplo: if A S1 else S0 executa a instrução S0 se A for uma matriz vazia. J. R. Caldas Pinto, J. M. da Costa Sousa 327 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 328 10
Instrução while O ciclo while executa as instruções enquanto a expressão de controlo for verdadeira (1). while expressão, instruções J. R. Caldas Pinto, J. M. da Costa Sousa 329 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 330 11
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 atribui a i ovector 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 conto uma das colunas de A. J. R. Caldas Pinto, J. M. da Costa Sousa 331 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); 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 332 12
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 333 Funções em Matlab J. R. Caldas Pinto, J. M. da Costa Sousa 334 13
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 335 Tipos de ficheiros.m (M-files) J. R. Caldas Pinto, J. M. da Costa Sousa 336 14
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 depo 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; J. R. Caldas Pinto, J. M. da Costa Sousa 337 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 subfunçõ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 subfunções é opcional, mas a função primária deve aparecer em primeiro lugar. J. R. Caldas Pinto, J. M. da Costa Sousa 338 15
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) average. a = sum(v)/n; % Subfunction Calculate function m = median(v,n) median w = sort(v); if rem(n,2) == 1 m = w((n+1)/2); else m = (w(n/2)+w(n/2+1))/2; % Subfunction Calculate J. R. Caldas Pinto, J. M. da Costa Sousa 339 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 340 16
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 341 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 342 17
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 343 Utilização do fprintf em Matlab J. R. Caldas Pinto, J. M. da Costa Sousa 344 18
Tipos de saída J. R. Caldas Pinto, J. M. da Costa Sousa 345 Caracteres de controlo J. R. Caldas Pinto, J. M. da Costa Sousa 346 19
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'); fclose(fid); 6 1 2 3 4 5 6 J. R. Caldas Pinto, J. M. da Costa Sousa 347 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'); fclose(fid); 2 3 1 2 3 4 5 6 J. R. Caldas Pinto, J. M. da Costa Sousa 348 20
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 % Prete-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 349 Leitura de matrizes Prete-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)]); fclose(fio); J. R. Caldas Pinto, J. M. da Costa Sousa 350 21
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 fclose(fid); J. R. Caldas Pinto, J. M. da Costa Sousa 351 Ex: Geração e Leitura de Imagens Manipulação de Imagens Imagem: matriz de M linhas e N colunas, com elementos que depem 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 352 22
Imagem em Matlab ima2=ones(80,100)*255; ima2(30:60, 30:80)=0; % seja um rectangulo interior imshow(ima2) imwrite(ima2, 'imagem02.tif'); Gravar no ficheiro ascii temp02.txt 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'); fclose(fid); J. R. Caldas Pinto, J. M. da Costa Sousa 353 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 354 23
Gravar imagens % 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'); fclose(fid); 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. J. R. Caldas Pinto, J. M. da Costa Sousa 355 24