Análise de Sinais
(5001)
Ficha Prática Laboratorial I
Curso: Ciências BiomédicasDuração prevista: 4 horas
Introdução ao MatLab – Operações com
Vectores e Matrizes
I. Introdução
O MatLab é um programa originalmente criado para resolver problemas numéricos de álgebra linear. Desde então observou-se um desenvolvimento muito grande, e é hoje usado nas mais variadas áreas, como por exemplo: Controlo de Sistemas; Processos Biológicos; Aerodinâmica; ou Termodinâmica. A sintaxe usada é em tudo semelhante à notação usada na álgebra tradicional, embora existam algumas, poucas, diferenças que interessa abordar.
O objectivo deste laboratório é o de efectuar uma introdução geral ao MatLab. O software trabalha essencialmente com vectores e matrizes. Na primeira parte deste laboratório ir-se-á fornecer uma introdução básica de como definir e introduzir vectores no MatLab. Na segunda parte do laboratório iremos estudar a definição de matrizes, exemplificar a sua manipulação matemática, e definir o acesso a partes dessa entidade. Finalmente, na terceira parte do laboratório, a matéria abordada nos pontos anteriores será reunida, e as potencialidades do MatLab serão exemplificadas.
II. Ambiente de desenvolvimento
O MatLab encontra-se instalado no seu computador. A Fig. 1 retrata o ambiente de trabalho que vamos usar no decorrer destes laboratório. Nela encontram-se identificados os campos mais importantes do software. No campo de gestão de ficheiros é possível manusear os ficheiros (abrir para editar, apagar, etc). Os dados existentes no ambiente de trabalho são listados em Dados no ambiente (não visível). No
directório de trabalho é escolhido o directório do disco onde se pretende trabalhar. Os últimos comandos,
que vão sendo introduzidos, ficam retidos no campo últimos comandos para utilização posterior. Finalmente, o campo mais importante do ambiente de trabalho é o prompt, através dele vai ser possível introduzir dados, ou comandos, e usar o MatLab para resolver os nossos problemas.
Gestão de ficheiros Dados no ambiente
Ultimos comandos
Prompt Directório de trabalho
Fig. 1 – Ambiente de trabalho do MatLab.
III. Alguns comando iniciais
O prompt do MatLab, para além de servir para inserir os dados de processamento como veremos mais adiante neste laboratório, também serve para introduzir comandos. Segue-se uma pequena lista desses comandos com a respectiva descrição. Devemos fazer notar que o MatLab é case-sensitive, quer isto dizer que diferencia letras maiúsculas de minúsculas, há que ter por isso cuidado com este pormenor.
quit – termina a execução do programa
help – fornece ajuda sobre um determinado item clear – apaga as variáveis introduzidas no ambiente clc – limpa a tela do ambiente de trabalho
who – lista as variáveis no ambiente de trabalho
whos – informação pormenorizada sobre todas as variáveis no ambiente de trabalho save – guarda em ficheiro as variáveis do ambiente de trabalho
load – carrega do disco para o ambiente de trabalho um ficheiro com variáveis
IV. Vectores
O MatLab é um software que permite facilmente manipular escalares, vectores e matrizes. O software usa uma sintaxe que se aproxima muito da usada na álgebra linear.
Um vector é definido colocando uma sequência de números dentro de parêntesis rectos. Como exemplo, introduza o seguinte vector:
>> a = [1 2 3]
>> a = [1, 2, 3]
A entrada do vector é concluída com um enter. Como resposta à entrada do vector o prompt exibe o resultado.
a =
1 2 3 >>
O resultado apenas é exibido se não for colocada um ponto e virgula no final (;) da instrução. Sempre que ocorrer uma atribuição, e de notar que estamos a atribuir à variável a o valor vectorial [ 1 2 3], se no final não for colocado um ponto e vírgula o resultado será exibido.
>> a a =
1 2 3 >>
O vector introduzido é sempre um vector linha. Se desejar introduzir um vector coluna deve realizar a operação de transposição da matriz, usando para isso o operador de transposição ( ‘ ).
>> a = [1 2 3]' a = 1 2 3 >>
Uma tarefa comum é o de criar vectores que representam um determinado padrão. O MatLab pode facilmente definir um vector com início em x1 e fim em x2, tendo o incremento y. A sintaxe usada é
>> a = [1:0.2:2] a =
1.0000 1.2000 1.4000 1.6000 1.8000 2.0000
Esta sintaxe pode ser abreviada se o incremento for unitário.
>> a = [1:5] a =
1 2 3 4 5
Exemplos de Aplicação
Introduza como exemplo de aplicação os seguintes vectores no ambiente de trabalho. Os comandos devem ser escritos na sintaxe mais compacta possível. O resultado deve ser guardo em ficheiro com o nome vectores.m através do comando save vectores.
1.
a
=
[1 2 3 4]
5.B
=
[
13 11 9 7 5 3 1
]
2.1
2
3
4
b
=
6.C
=
[0.1 0.2 0.3 0.4 0.5 0.6 0.7]
3.c
=
[5]
7.D
=
[0.4 0.4 0.4 0.4 0.5 0.6 0.7]
4.A
=
[
1 3 5 7 9 11 13
]
8.d
=
[1 2 .... 100]
Acesso a elementos de um vector
Os dados introduzidos nos vectores podem ser acedidos individualmente através da sintaxe do exemplo seguinte. A célula do vector a que se pretende ter acesso é colocada entre parêntesis curvos.
>> A(3) ans = 5
Devemos observar que uma nova variável foi criada e designada por ans, isto ocorre sempre que houver necessidade de devolver um resultado sem que se tenha realizado uma atribuição. Se executar o comando
who irá encontrar esta nova variável no ambiente de trabalho.
Para ter acesso a mais do que uma célula do vector apenas temos que indicar o seu índex. De notar que o índex da primeira célula é 1.
>> A([1 3 5]) ans =
1 5 9
Ou, usando uma operação já estudada.
>> A([1:2:5]) ans =
1 5 9
Esta sintaxe alternativa pode ser usada para alterar uma ou mais células de um vector. Para atribuir novos valores às células 1, 3 e 5 da matriz A basta escrever.
>> A([1:2:5]) = [11 55 99] A =
11 3 55 7 99 11 13
Devemos ter cuidado, a dimensão da matriz a atribuir deve ser igual à dimensão da matriz indexada. Uma potencialidade da sintaxe disponibilizada pelo MatLab é a de criar matrizes partindo de outras, ou parte de outras, matrizes. Como exemplo podemos definir a matriz a e b e criar a matriz c e c1.
>> a = [1:10]; >> b = [-10:1:1]; >> c = [a b] c = Columns 1 through 12 1 2 3 4 5 6 7 8 9 10 -10 -9 Columns 13 through 22 -8 -7 -6 -5 -4 -3 -2 -1 0 1 >> c1 =[a(1:2:10) b(1:2:10)] c1 = 1 3 5 7 9 -10 -8 -6 -4 -2
Para terminar esta introdução à criação de vectores vamos apresentar uma nova sintaxe para criar vectores coluna. Usando o carácter ponto e virgula (;) é possível criar um vector coluna sem necessidade de ter que recorrer ao operador de transposição. Um exemplo de criação de uma matriz coluna.
>> a = [1;2;3;4] a = 1 2 3 4 Exemplos de Aplicação
Para realizar este exercício devemos usar o comando clear para limpar todas as variáveis, e de seguida usar o comando load vectores.m para carregar o ficheiro de dados já armazenado no disco. Usando o que aprendemos no ponto anterior, vamos criar novas variáveis baseadas nas anteriores. O resultado deve ser guardado no ficheiro vectores1.m.
1. a1 formado pelas células impares do vector a. 2. b1 formado pelas células pares do vector b. 3. c1 formado pela matriz coluna dos elementos
pares de b.
4. C1 formado por 5 cópias em linha do escalar c
Operações básicas com vectores
Agora que já dominamos a notação que nos permite criar e manipular vectores, podemos avançar para a realização de operações básicas. Assim, as operações de soma (+), subtracção (-), divisão escalar (/), e multiplicação escalar (*), são realizadas com uma sintaxe em tudo igual à usada na álgebra linear. Dada a sua simplicidade, um exemplo será suficiente.
>> a = [1:5]; >> b = [6:10]; >> a + b ans = 7 9 11 13 15 >> a - b ans = -5 -5 -5 -5 -5 >> 2*a ans = 2 4 6 8 10 >> a/3 ans = 0.3333 0.6667 1.0000 1.3333 1.6667
Se observarmos, as operações realizadas cumprem as regras entre operandos estabelecidas para as operações pela Álgebra Linear. Caso seja necessário efectuar operações entre elementos correspondentes dos vectores, são definidas as seguintes operações matemáticas: multiplicação de elementos (.*), divisão de elementos (./), ou exponencial de elementos (.^). Temos que a sintaxe a utilizar será
>> a.*b ans = 6 14 24 36 50 >> a./b ans = 0.1667 0.2857 0.3750 0.4444 0.5000 >> a.^2 ans = 1 4 9 16 25 >> a.^b ans = 1 128 6561 262144 97656
As dimensões dos vectores a utilizar deve ser idêntica. Um exemplo dessa falta de correspondência é dado no exemplo seguinte.
>> a*b' ans = 130 >> a*b
??? Error using ==> mtimes
Inner matrix dimensions must agree.
O vector a e o vector b não podem ser multiplicados já as suas dimensões não o permitem.
Exemplos de Aplicação
Vamos então de seguida realizar algumas operações básicas entre vectores. Para isso devemos carregar o ficheiro de dados vectores.m. Antes de realizarmos estas operações devemos verificar se são possíveis de executar. 1.
a a
+
5.a c
/
2.a b
*
6.a d
*
3.a b
.*
7.a
^ 2
4.c a
*
8.a
. ^ 2
V. Matrizes
Para além de vectores, o MatLab permite também processar dados na forma matricial. Iremos agora dar uma introdução à utilização destes elementos.
Definição de matrizes
A definição de uma matriz é em tudo similar à de um vector. Assim uma matriz pode ser considerada como uma coluna de vectores linha. Claro que o número de elementos em cada vector linha será igual, pois não podem ser definidos espaços vazios na matriz.
>> A = [1 2 3; 4 5 6; 7 8 9] A =
1 2 3 4 5 6 7 8 9
Em alternativa também podemos usar a seguinte notação >> A = [1 2 3 4 5 6 7 8 9] A = 1 2 3 4 5 6 7 8 9
Também podemos usar a sintaxe aprendida para criar vectores
>> A = [ [1:3]; [4:6]; [7:9]] A =
1 2 3 4 5 6 7 8 9
Ou, ainda, em alternativa
>> A =[[1:3:7]' [2:3:8]' [3:3:9]'] A =
1 2 3 4 5 6 7 8 9
Tal como no caso vectorial, também os elementos das matrizes podem ser acedidos individualmente ou em grupo. Para isso vamos indexar os elementos a que pretendemos ter acesso. Para obter da matriz A a submatriz constituída pelas células 4, 5, 7, e 8 teremos que usar a sintaxe
>> A(2:3,1:2) ans =
4 5 7 8
No primeiro campo da indexação são definidas as linhas, enquanto que no segundo campo definimos as colunas.
Também é possível alterar elementos da matriz. Assim, caso seja desejável podemos fazer
>> A(2:3,1:2) = [44 55; 77 88] A =
1 2 3 44 55 6 77 88 9
Tal como no caso dos vectores voltamos a referir que cabe ao utilizador garantir a legalidade da operação. Neste caso, a dimensão da submatriz indexada deve ser igual à da matriz que se vai atribuir.
Exemplos de aplicação
Tal como fizemos no caso da introdução de vectores vamos introduzir no nosso ambiente de trabalho algumas matrizes. Antes, e porque queremos depois guardar o resultado do exercício, vamos executar o
comando clear para apagar todas as variáveis ai existentes. O resultado do exercício deve ser guardado no ficheiro matriz.m. 1.
1 5
9 13
2 6 10 14
2
3 7 11 15
4 8 12 16
a
=
2.1
2
3
4
5
6
7
8
2
9 10 11 12
13 14 15
6
b
=
3.c
2
=
a
2([1: 4],[1: 2])
4. Colocar os elementos dea
2([1: 2 : 4],[1: 2 : 4])
a zero e atribuir a d2
Funções com matrizes
Uma vez habilitado a criar e manipular matrizes, vectores e escalares, podemos efectuar operações matemáticas definidas pela álgebra linear. Devemos voltar a afirmar que cabe ao utilizador garantir a coerência dos dados introduzidos, assim como a avaliação dos resultados obtidos. A função inv(A) devolve a inversa da matriz A, ainda que A não seja invertível. Neste caso o utilizador é informado de que deve prestar atenção ao resultado obtido.
>> inv(A)
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.541976e-018. ans =
1.0e+016 *
-0.4504 0.9007 -0.4504 0.9007 -1.8014 0.9007 -0.4504 0.9007 -0.4504
Outra operação disponível será o cálculo de valores próprios da matriz. Existem duas versões diferentes na forma como se usa esta rotina. A primeira apenas devolve os valores próprios da matriz, enquanto que a segunda devolve quer os valores próprios quer os vectores próprios da matriz. Para obter ajuda relativa a esta função pode-se escrever no prompt do MatLab help eig.
>> eig(A) ans = 16.1168 -1.1168 -0.0000
v = -0.2320 -0.7858 0.4082 -0.5253 -0.0868 -0.8165 -0.8187 0.6123 0.4082 e = 16.1168 0 0 0 -1.1168 0 0 0 -0.0000 >> d = diag(e) d = 16.1168 -1.1168 -0.0000
Dependendo da notação usada na invocação da função eig assim são devolvidos resultados diferentes. Observe com cuidado cada um deles. O último comando a ser usado (diag) permitiu reunir no vector d a diagonal da matriz e.
Uma listagem das funções mais usadas para trabalhar com matriz pode ser obtida escrevendo help
elmat. Num próximo laboratório iremos abordar algumas delas mais em pormenor.
Operações com matrizes
Existem também rotinas que permitem encontrar a solução de equações. Por exemplo, se for definido
Ax = b, e desejarmos encontrar a solução x do sistema, uma forma lenta, ainda que simples, de o realizar,
será o de inverter A e efectuar uma multiplicação à esquerda dos dois lados do sistema. Devemos desde já afirmar que existem métodos muito mais eficazes de resolver este problema, e que o MatLab está preparado para o fazer.
Antes devemos relembrar que as variáveis A e B são ambas matrizes, e que AB não é necessariamente igual a BA. Para esse efeito, o MatLab usa dois operadores diferentes, “/“ e “\”. Exemplos da sua utilização são dados em seguida. É deixado como exercício ver o que é que cada um deles faz.
>> A = [1 2 3; 4 5 6; 7 8 9 ];
>> B = [ [1 2 3]' [2 4 7]' [3 5 8]']; >> v = [1 3 5]';
>> x = A\v
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.541976e-018. x = 2.8333 -4.6667 2.5000 >> x = B\v x = 2
1 -1 >> B*x ans = 1 3 5 >> x1 = v'/B x1 = 4.0000 -3.0000 1.0000 >> x1*B ans = 1.0000 3.0000 5
Como verificamos o MatLab permite de forma fácil e eficaz introduzir vectores e matrizes. Este é o verdadeiro poder desta ferramenta. Assumimos pois que foram adquiridas as bases necessárias à definição e manipulação de matrizes e vectores, assim como a indexação dos seus elementos. Vamos prestar atenção à adição e subtracção de matrizes. A notação a usar é a mesma que se usa na álgebra linear. Podemos definir dois vectores para adicionar e subtrair.
>> v = [1 2 3]' v = 1 2 3 >> b = [2 4 6]' b = 2 4 6 >> v+b ans = 3 6 9 >> v-b ans = -1 -2
A multiplicação de vectores e matrizes segue regras próprias. No exemplo anterior, os vectores foram definidos como vectores coluna, ou seja possuem uma dimensão 1x3. Tal como não se pode adicionar um vector linha com um vector coluna, também na multiplicação se deve respeitar a regra: o número de colunas da matriz à esquerda do operador deve ser igual ao número de linhas da matriz à direita do operador. >> v*b
??? Error using ==> *
Inner matrix dimensions must agree. >> v*b' ans = 2 4 6 4 8 12 6 12 18 >> v'*b ans = 28
Finalmente, para terminar o laboratório, vamos fazer um pequeno exemplo que nos revela o potencial do MatLab como ferramenta de estudo e investigação. Uma tarefa tão simples como representar graficamente um sinal periódico de frequência angular 2πf rad/s.
>> f = 50; >> w = 2*pi*50; >> t = [0:375e-6:0.2]; >> u = 220*sqrt(2)*sin(w*t); >> plot(t,u); >> grid >> close