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
Download

Tutorial introdutório ao MATLAB