Uma muito breve introdução ao MATLAB (semana: 9-13 de Março de 2009) O MATLAB é um programa interactivo para cálculo científico e de engenharia, cujo o elemento básico é o array (o qual não requer dimensionamento), o que permite resolver de uma forma eficiente problemas baseados na manipulação de matrizes. O Nome MATLAB é uma abreviatura de MATrix LABoratory. O MATLAB possui um conjunto de Toolboxes que são um conjunto de funções MATLAB (M-files) específicas para uma dada aplicação e/ou tecnologia: Redes Neuronais, Controlo de Sistemas, Processamento de Sinal, etc. O sistema MATLAB possui 5 partes principais: a) b) c) d) e) As ferramentas para utilização e desenvolvimento; A biblioteca de funções matemáticas; A linguagem de programação (de alto nível) As funções gráficas; As bibliotecas de interfaces que permitem escrever programas em C e Fortran que interagem com o MATLAB. 1. Matrizes e Arrays Em MATLAB, um array é uma estrutura de dados multi-dimensional em que cada elemento do array é acedido por um conjunto de índices. Uma matriz é um array numérico de dimensão 2, que representa uma transformação linear. Um escalar é uma matriz 1x1. Um vector coluna é uma matriz nx1. Um vector linha é uma matriz 1xn. 1 1.1. Manipulação de Matrizes Definir a matriz A: A=[ 1 , 2 , 3 ; 4 , 5 , 6 ; 7 8 9 ] Aceder aos elementos de A: A12=A(1,2) Alterar os elementos de A: A(1,2)=20 ou A(1,2)= A(1,2)+10 { teste: A(4,1) = 100 } Aceder a vectores linha de A: A1j=A(1,:) Aceder a vectores coluna de A: Ai1=A(:,1) Aceder a vários componentes de A: vec1=A(1,1:2) Transposta de uma matriz: B = A’ Dimensão de uma matriz: dimens = size(A) ou [linh , coln]=size(A) Elementos da Diagonal de uma matriz: vec2 = diag(A) Soma dos elementos de um vector: valor= sum(diag(A)) Criar um vector com elementos igualmente espaçados: Trocar as colunas de uma matriz: B = A(:,[3 2 1]) Trocar as linhas de uma matriz: B = A([1 3 2],:) { erro : A(4,1) } vec3 = [1:10] vec4 = [1:2:10] vec5 = [10:-2:1]’ 2 1.2. Expressões As expressões matemáticas operam sobre matrizes. As expressões são constituídas por variáveis, números, operadores e funções. Variáveis O MATLAB não necessita da definição de tipo e dimensões de uma variável. Os nomes de variáveis começam sempre por uma letra seguida de letras, dígitos ou underscores (comprimento máx: 63 símbolos). O MATLAB é “case sensisitive”. O comando who (e whos) permite saber quais as variáveis definidas no espaço de trabalho. Números O MATLAB utiliza a notação decimal convencional. A notação científica utiliza a letra e seguida de um número inteiro para representar um factor de escala de uma potência de 10. Os números imaginários são representados tendo i ou j como sufixos de um número real. Todos os números são representados internamente usando o formato long da norma IEEE (ver comandos: realmax, realmin). Precisão (ver: comando eps) Operadores Adição (+), subtracção (-), multiplicação (*), divisão (/), potência (^). A=[1,2,3;4,5,6;7 8 9] b = A(1,:)*A(:,3) B = A * A’ C = 2*A-B D=A–1 % expansão escalar A(1:2,3) = 0 % expansão escalar 3 Funções Existem um conjunto muito grande de funções matemáticas definidas. Fazer help elfun , help specfun, e help elmat. Algumas funções são built-in (fazem parte do núcleo do MATLAB) e logo não é possível ver o seu código, outras são implementadas em M-files. Algumas funções fornecem os valores de constantes úteis: pi, i (ou j), Inf (Infinito), NaN (Not-a-Number). c= -1 abs_c = abs(c) x = pi coseno_x = cos(x) y = abs(cos(x))’ Mais algumas funções: exp , sqrt , log , ... 1.3. Mais Operações sobre Matrizes Geração de matrizes básicas: A = zeros(2,3) B = ones (2,2) = ones(2) C = eye(3) % matriz identidade 3x3 D = rand(3,2) % matriz de nºs aleatórios com distribuição uniforme entre [0,1] E = randn(5,4) % matriz de números aleatórios com distribuição normal (média = 0,dev.padr = 1) F = round(10*rand(1,5)) Concatenação de matrizes: A = [1 ,2 ; 3 , 4] B = [5 , 6 ; 7 , 8] C = [A , B] D= [A ; B] A função cat E = cat(2,A,B) F = cat(1,A,B) 4 Eliminar linhas ou colunas de uma matriz: A = [1 2 3; 4 5 6; 7 8 9] A(3,:) = [] % elimina a 3ª linha A(:,1) = [] % elimina a 1ª coluna Determinante, inversa, valores e vectores próprios de uma matriz: A = [2 0 1; 0 3 5; 1 3 0] determ = det(A) inversa = inv(A) [vec_prop, val_prop] = eig(A) teste = A*vec_prop(:,1) – val_prop(1,1)*vec_prop(:,1) polin_caract = poly(A) % det(A-λI)=0 raizes = roots(polin_caract) % igual aos valores próprios de A 1.4. Manipulação de Arrays Se não se estiver no contexto da álgebra linear, uma matriz pode ser vista como uma array numérico bi-dimensinal. As operações aritméticas em arrays são feitas elemento a elemento. Isto significa que a adição e a subtracção funcionam do mesmo modo para matrizes e para arrays. No entanto, para as operações multiplicativas tal não acontece. O ponto como prefixo de uma operação indica que se está a operar sobre arrays (i.e. elemento a elemento). Multiplicação, exponenciação e divisão elemento a elemento: .* , .^ , ./ vec = [1 2 3] .* [6 3 2] mat = [1 2 ; 3 4] .^ [3 2 ; 3 1] vec = [1 2 3] ./ [2 4 6] 5 Construção de tabelas: k=[0:10:100] % temperatura em graus Celsius tabela = [k ; k*(9/5)+32 ; k + 273.15] % conversor para graus Fahrenheit e Kelvin Em geral, as funções operam sobre arrays elemento a elemento: C = [ -1 , 4 ; -5 , -7] abs_C = abs(C) x = [0:pi/4:2*pi] tabela_seno = [x’ , sin(x’)] Operadores relacionais eq ne lt gt le ge == ~= < > <= >= d = le([1 4 5],[2 3 6]) % d é um vector logico e = [1 4 5] <= [2 3 6] f = [ 10 20 30] g = f > 15 k = find (f > 15) % determina os índices dos elementos que respeitam a condição lógica f(k) Operadores Lógicos and or not xor & | ~ 6 2. M-files São ficheiros de texto contendo código MATLAB. Pode-se utilizar o editor do MATLAB e criar um ficheiro com extensão .m que possui um conjunto de expressões semelhantes às introduzidas na linha de comando. >> teste ; --- pode ser utilizado no fim de uma expressão para que o seu resultado não sejam apresentado no visor. ... --- podem ser utilizadas para mudar de linha, nos casos em que as expressões são extensas. 3. Programação em MATLAB 3.1. Controlo de Fluxo Existem várias instruções para controlo do fluxo de um programa. Instrução for O ciclo for repete um grupo de instruções um número determinado de vezes. A palavra end determina o fim das instruções a realizar. A = [1 2 ; 3 4]; [n_lin,n_col]=size(A); for i=1:n_lin for j=1:n_col A_transp(j,i) = A(i,j); end end A A_transp 7 Instrução while O ciclo while repete um grupo de instruções um número indefinido de vezes, sob controlo de uma condição lógica. A palavra end determina o fim dessas instruções. x = [1 0 0 2 0 3]; n = length(x); y=[]; i=1; while (i<=n)&(x(i)~=2) y(i)=x(i); i=i+1; end y Instrução if A instrução if avalia uma expressão lógica e executa um grupo de instruções se a expressão lógica for verdadeira. Os comandos opcionais elseif e else permitem a execução de outros grupos de instruções. Uma expressão if termina sempre com a palavra end. x = [1 2 3 4 5 9]; n=length(x); media=sum(x)/n; for i=1:n if x(i)<media y{i}='valor baixo'; % cell array ver à frente a sua definição elseif x(i)>media y{i}='valor alto'; else y{i}='valor medio'; end end media x y Para comparar duas matrizes A e B deve-se utilizar a função isequal e não A = = B. Ver também as funções isempty, all, e any. 8 Instrução switch-case-otherwise A instrução switch executa grupos de instruções com base no valor de uma variável ou expressão. case e otherwise delimitam os grupos a ser executados. Apenas o grupo associado ao primeiro case que é verificado é executado. Uma instrução switch termina com end. x=[0 1 2 3 5]; n=length(x); for i=1:n switch rem(x(i),2) case 0 y{i}='par'; otherwise y{i}='impar'; end end x y Instrução continue A instrução continue passa o controlo para a iteração seguinte do ciclo for ou while no qual aparece, não executando as restantes instruções do corpo do ciclo. x = [1 0 -3 0 0 4 5 9 0 7]; n = length(x); num_element_nao_zero=0; for i=1:n if isequal(x(i),0) continue; end num_element_nao_zero=num_element_nao_zero+1; end num_element_nao_zero 9 Instrução break A instrução break permite sair do ciclo for ou while em que está definida. x = round(10*rand(1,7)); y=[]; for i=1:length(x) if ~isequal(x(i),2) y(i)=x(i); else break end end x y 4. Outros Tipos de Dados 4.1. Arrays Multi-Dimensionais Os arrays podem ter dimensão maior do que 2. H(:,:,1)=[1 2 ; 3 4] H(:,:,2)=[5 6;7 8] >> H(1,2,2) 4.2. Cell Arrays (Célula de Arrays) Cell arrays são arrays multidimensionais cujos os elementos são também arrays. Os cell arrays podem ser construídos incluindo uma colecção de arrays entre chavetas. Os elementos dos cell arrays são acedidos utilizando os índices respectivos entre chavetas. cel = { 1 , [1 , 2; 3 , 4]; [10 20] , [30 40]’ } cel{2,2} 10 4.3. Caracteres e Texto A entrada de texto em MATLAB pode ser feita do seguinte modo: >> txt = ‘Lisboa’ O resultado é um array de caracteres. >> txt(1) Internamente, os caracteres são armazenados como números inteiros representados por 16 bits. >> numer = double(txt) Converte o array de caracteres numa matriz numérica contendo a representação em virgula flutuante dos códigos ASCII de cada caracter. A função char reverte o processo. >> txt_2 = char(numer) A concatenação de arrays de caracteres: >> txt_3 = [‘Lisboa’ ‘ Porto’] >> txt_4 = [‘Lisboa’ ; ‘Porto’] % erro – dim. diferentes >> txt_4 = char('Lisboa' , 'Porto') % array de caracteres “formatado” >> txt_5 ={‘Lisboa’ ; ‘Porto’} % cell array >> txt_5{1}(2) >> txt_6 = cellstr(txt_4) % converte um array de caracteres “formatado” num cell array >> txt_7 = char(txt_6) % operação inversa da anterior 11 4.4. Estruturas Estruturas são arrays multidimensionais com elementos que são acedidos por designadores de campo. >> Salas(1).nome = 'F4' >> Salas(1).capacidade = [40 , 20] >> Salas(1).localizaçao = 'PNL' >> Salas(2).nome = 'C10' >> Salas(2).capacidade = [30 , 15] >> Salas(2).localizacao = 'PC' >> Salas(1).capacidade(2) >> capacids = {Salas.capacidade} >> IST.salas = Salas >> IST.jardins = [] 4.5. Resumo dos Tipos de Dados 12 5. Scripts e Funções M-files são ficheiros que contêm código em linguagem MATLAB. Existem dois tipos de M-files: a) os scripts, os quais não aceitam argumentos de entrada nem devolvem argumentos de saída, mas apenas operam em dados do espaço de trabalho; b) as funções, as quais aceitam argumentos de entrada e devolvem argumentos de saída, em que as variáveis internas são locais à função. 5.1. Funções Na definição da função, o nome da função e da M-file associada deve ser o mesmo. Exemplo: function [soma , media] = soma_media (x) % função que calcula a soma e a média de um vector % [soma , media] = soma_media (x) [lin,col] = size(x); if isequal(min([lin,col]), 1) soma = sum(x); media = soma/length(x); elseif min([lin,col])>1 disp('Argumento e´ matriz'); soma = []; media = []; return; else disp('Argumento e´ vector vazio'); soma = []; media = []; end 13 Function Handle É possível criar um function handle para qualquer função e depois passá-lo como argumento de entrada de outra função, que por sua vez irá avaliá-la (executá-la). function [z] = quadrado (x,func_hand) y = feval(func_hand,x); z=y.*y; >> res=quadrado([pi pi/2 pi/4],@sin) Função input dados = input(‘Qual o valor de x? ’) ; 14 6. Gráficos A função básica para fazer gráficos é a função plot: x = 0:pi/100:2*pi; y = cos(x); figure(1) plot(x,y) xlabel('x = 0:2\pi') ylabel('Coseno de x') title('Grafico da funçao Coseno','FontSize',12) Múltiplos plots numa figura: x = 0:pi/100:2*pi; y = cos(x); z = sin(x); figure(2) plot(x,y,x,z) grid on legend('cos(x)','sin(x)') axis([-1 7 -1.5 1.5]) Especificar tipo de linhas e cores: t1 = [0:0.001:2]; t2 = [0:0.1:2]; x1 = (1-exp(-t1)).*sin(2*pi*10*t1); x2 = (1-exp(-t2)).*sin(2*pi*10*t2); figure(3) hold on plot(t1,x1,'y:'); plot(t2,x2,'ro'); hold off Gráfico no plano complexo: t=[0:(2*pi)/1000:2*pi]; z=exp(-0.5*t+t*i); figure(4); plot(z) grid on axis([-1 1 -1 1]) axis equal % mesma escala 15 Múltiplos gráficos numa figura: t=[0:0.001:1]; figure(5) subplot(2,2,1),plot(t,sin(2*pi*1*t)), grid on subplot(2,2,2),plot(t,sin(2*pi*5*t)), grid on subplot(2,2,3),plot(t,sin(2*pi*10*t)),grid on subplot(2,2,4),plot(t,sin(2*pi*20*t)),grid on 16