Capítulo 2
Neste Capítulo
1
Construção de vetores4
Construção de matrizes5
Operações sobre matrizes6
ExercíciosUNESP
www.feg.unesp.br/~anibal Guaratinguetá, SP, Brasil
Vetores e Matrizes
por Anibal Azevedo
O nome Matlab provém da abreviação de Matrix Laboratory e não é a toa que este ambiente de programação dispõe de recursos que facilitam a construção e a manipulação de vetores e matrizes como será mostrado a seguir.
Construção de vetores
A construção de um vetor linha em MATLAB pode ser realizada de muitos modos:
>> v = [1 2 3 4]
v =
1 2 3 4
>> t = 1:1:4 t =
1 2 3 4
>> s = 1:4 s =
1 2 3 4
>> r = linspace(1,4,4) r =
1 2 3 4
>> p = logspace(1,2,2) p =
10 100
O vetor v é construído descrevendo-se cada elemento que o compõe, ou seja, utilizando a seguinte sintaxe
a a a
n
v
1 2
, ondea
i é oi-ésimo elemento do vetor.
Informação adicional:
O vetor v poderia, portanto, ser construído usando outros números, como por exemplo:
>> v = [50 27 78 23]
v =
50 27 78 23
Já o vetor t é construído considerando- se a sintaxe
t a
1: k : a
n, quefornece o vetor
a a k a
n
t
1 1
, ondea
1é o valor inicial,
k
é a razão da progressão aritmética que define a seqüência, ea
no último termo da seqüência.Informação adicional:
Ao se construir o vetor t, a razão
k
poderia ser negativa, como por exemplo:>> t = 4:-1:1 t =
4 3 2 1
A razão
k
também pode ser fracionária:>> t = 1:1.7:4 t =
1.0000 2.7000
Neste caso, como o último elemento (4.7) supera o valor definido para
a
n, a seqüência será definida apenas pelo vetor [1 2.7].A construção do vetor s é um caso particular da estrutura utilizada para o vetor t, tal que a razão
k
é omitida, e o MATLAB irá supor quek
= 1.Erro comum:
Ao se construir um vetor como 4:-1:1, se o valor da razão
k
= -1 for omitido, como 4:1, então, será gerado um matriz vazia e não o vetor dado por [4 3 2 1].M atlab R ápido e P rático
O comando linspace possui a sintaxe:
linspace(
a
1,a
n,n
), ondea
1 é o valor inicial,a
n é o último termo da seqüência, en
é o número de elementos da seqüência, incluindoa
1 ea
n. Sen
for omitido, então,n
= 100.Por último, o comando logspace(
d
1,d
N,N) constrói um vetor de N pontos logarítmicos igualmente espaçados entre os valores10
d1 e10
d2. Caso N seja omitido, N será igual a 50.Um vetor coluna pode ser construído de maneira semelhante ao vetor linha:
>> s = [10; 20; 30; 40]
s = 10 20 30 40
>> s = (10:10:40)' s =
10 20 30 40
Erro comum:
Ao se construir um vetor linha, o mesmo pode ser transformado em um vetor coluna por meio do operador transposto (s = s‘).
Porém, a atribuição s = 10:10:40’ irá fornecer um vetor linha.
OPERAÇÕES SOBRE VETORES Para se ter acesso a um elemento de um vetor r basta utilizar o operador parênteses:
>> v = [50 27 78 23]
v =
50 27 78 23
>> v(2) ans = 27
Mais de um elemento do vetor pode ser acessado simultaneamente, bastando utilizar um vetor de índices:
>> v(2:4) ans =
27 78 23
>> v([1 4]) ans = 50 23
>> v(4:-1:1) ans =
23 78 27 50 v([2 1 4 3])
ans =
27 50 23 78
Observe que ao fazer referência a mais de um
elemento, a resposta será, também um vetor. Além disso, o último comando fornece uma nova ordenação para o vetor original.
O cálculo do tamanho de um vetor é realizado pelo comando length:
>> length(v) ans = 4
Dica de desempenho:
Uma primeira forma de se acessar o último elemento de um vetor é dada por: v(length(v)).
Porém, ao invés de se calcular o tamanho do vetor, pode-se utilizar a palavra reservada end:
v(end).
A sequência de Fibonacci
Sugestão de leitura: Livro “Alex no País dos Números” de Alex Bellos A sequência de Fibonacci tem esse nome porque os termos aparecem no Liber Abaci de Fibonacci ao descrever, em um problema, o crescimento de uma população de coelhos. O problema começa com um único casal de coelhos adulto, considera que em um mês 1 casal adulto dá luz a outro casal e que cada casal de coelhos recém-nascido leva um mês para se tornarem adultos. A pergunta é dentro de um ano quantos casais o casal inicial produz em um ano.
A sequência a ser produzida é dada por: 1 2 3 5 8 13... O mesmo padrão aparece em outros fenômenos da natureza tais como o crescimento de uma população de abelhas. Cada número de Fibonacci é tradicionalmente descrito usando-se F com um subscrito para denotar a posição do número na sequência e é tal que: F1 = 1, F2 = 1, F3 = 2, F4 = 3, F5 = 5 e assim por diante. Os termos da sequência podem ser gerados pela relação de recorrência dada por: Se n = 1 ou 2, Fn = 1; Senão Fn = Fn-1 + Fn-2. Por exemplo: F3 = F2 + F1 = 1 + 1 = 2.
Tarefas em Matlab Empregando o Matlab:
(1) Construa os 5 primeiros termos da sequência de Fibonacci usando vetor.
(2) Resolva o problema proposto por Fibonacci.
(3) Verifique que a razão entre sucessivos termos da sequência de Fibonacci converge para (fi) = 1,618 que é a denominada razão aúrea. A razão aúrea era empregada em construções gregas antigas como o Phartenon ou pinturas como a Monalisa e é tida por muitos estudiosos como aquela que representa a proporção mais agradável entre dois segmentos de reta, por exemplo.
MRP2011
Para encontrar o índice associado ao elemento contido em um vetor, usa-se o comando find:
>> v v =
50 27 78 23
>> find(v < 10) ans =
[]
>> find(v > 50) ans =
3
>> find(v >= 50) ans =
1 3
>> find(v == 50) ans =
1
Para encontrar o elemento, e não apenas o índice do mesmo no vetor, que satisfaça o critério do comando find, usa-se o seguinte encadeamento de comandos:
>> v(find(v == 50)) ans =
50
>> v(find(v >= 50)) ans =
50 78
>> v(find(v < 10)) ans =
[]
Vale observar que a pesquisa realizada por meio do comando find utilizou os operadores relacionais e lógicos.
O objetivo destes operadores é fornecer respostas do tipo falso ou verdadeiro a perguntas. Eles serão particularmente importantes no controle de fluxo ou na ordem de execução de comandos, e, portanto, para a construção de
programas em MATLAB. Os
operadores relacionais e lógicos existentes são:
Operador Descrição
< Menor que
<= Menor ou igual a
> Maior que
>= Maior ou igual a
== Igual a
= Atribuição
~= Diferente de
~ Negação
not Negação
& E
| Ou
all Verdadeiro se todos os elementos não são zero.
any Verdadeiro se pelo menos um elemento não é zero.
xor Retorna 1 quando x ou y diferente de zero. Retorna 0 se ambos forem iguais a 0 ou 1.
Erro comum:
Ao realizar a comparação
“a == 1” é comum o erro de se omitir um dos sinais de igualdade. Com isso, a expressão resultante será “a = 1”, uma atribuição. Para prevenir a ocorrência deste erro de lógica use sempre “1 == a”, pois “1 = a” não será aceito pelo MATLAB.
Erro comum:
A comparação por meio do operador “==” é válida para números inteiros. Para se comparar números não inteiros deve-se usar a seguinte sintaxe “abs(a – 1.234433) >= precis”, onde precis é a precisão estipulada, tal que a variável
“a” está suficientemente próxima do valor “1.234433”.
Os comandos max e min encontram os
valores máximo e mínimo,
respectivamente, de um vetor:
>> p = [2 3 -1 50 10 -1 50]
p =
2 3 -1 50 10 -1 50
>> max(p) ans = 50
>> min(p) ans = -1
>> [ele,ind]=max(p) ele =
50 ind = 4
A média, o desvio padrão, a variância e a covariância são obtidos com os comandos mean, std, var e cov, respectivamente.
>> mean(p) ans =
16.14285714285714
>> std(p) ans =
23.41956853736188
>> var(p) ans =
5.484761904761906e+002
>> cov(p) ans =
5.484761904761905e+002
A ordenação de um vetor pode ser feita pelo comando sort:
>> sort(v) ans =
23 27 50 78
A resposta fornecida será um vetor ordenado em ordem crescente.
Um vetor, cujos elementos são números inteiros, com uma ordenação aleatória pode ser criado com o comando randperm:
>> randperm(4) ans =
3 2 1 4
CONSTRUINDO MATRIZES
O procedimento para se construir uma matriz em MATLAB é semelhante às técnicas empregadas para se construir um vetor linha ou coluna:
>> A = [1 2 3; 4 5 6]
A =
1 2 3 4 5 6
>> B(1,1) = 1;
>> B(2,2) = 2;
>> B(3,3) = 3 B =
1 0 0 0 2 0 0 0 3
>> B(:,:) = diag([1 2 3]) B =
1 0 0 0 2 0 0 0 3
>> B = diag([1 2 3]) B =
1 0 0 0 2 0 0 0 3
Para acessar o elemento
a
ijda matriz A:>> A(2,3) ans = 6
Mais de um elemento pode ser acessado simultaneamente. Para se acessar os elementos
a
13 ea
23, basta proceder como se segue:>> A(:,3) ans = 3 6
Para acessar
a
11 ea
21:>> A([1 2],1) ans = 1 4
Existe, ainda, a alternativa de se acessar os elementos da matriz como se a mesma fosse um vetor cujos elementos foram agrupados coluna após coluna:
>> A([3 5 6]) ans = 2 3 6
Para modificar o elemento
a
ij da matriz A, deve ser utilizado o acesso que é fornecido pelo operador parênteses:>> A(2,3)= 344.4 A =
1.0000 2.0000 3.0000 4.0000 5.0000 344.4000
Para modificar vários elementos da matriz simultaneamente:
>> A([1 2],1) = -10 A =
-10.0000 2.0000 3.0000 -10.0000 5.0000 344.4000
Uma matriz pode ser construída a partir de vetores, utilizando os seguintes comandos:
>> C = [1:3; 4:6; 7:9]
C =
1 2 3 4 5 6 7 8 9
>> D(:,1) = (1:3)' D =
1 2 3
>> D(:,2) = (4:6)' D =
1 4 2 5 3 6
>> D(:,3) = (7:9)' D =
1 4 7 2 5 8 3 6 9
Um vetor pode ser transformado em uma matriz e vice-versa por meio do comando reshape:
>> reshape(C,1,9) ans =
1 4 7 2 5 8 3 6 9
>> reshape(C',1,9) ans =
1 2 3 4 5 6 7 8 9 Uma coluna ou linha pode ser eliminada por meio do operador colchete ( [] ):
>> D(:,3) = []
D = 1 4 2 5 3 6
>> D(2,:) = []
D = 1 4 3 6
É importante observar que, ao se fazer referência aos elementos de uma matriz, o operador “:” equivale ao comando 1:end.
Alguns comandos especiais para a geração de matrizes:
>> A = rand(2,2) A =
0.3420 0.3412 0.2897 0.5341
>> B = ones(2,1) B =
1 1
>> C = zeros(1,2) C =
0 0
>> D = 100*eye(1) D =
100
É possível, ainda construir um matriz que seja a composição de outras matrizes, desde que as dimensões sejam compatíveis:
MRP2011
>> R = [A B; C D]
R =
0.3420 0.3412 1.0000 0.2897 0.5341 1.0000 0 0 100.0000
Uma lista das funções que geram matrizes especiais, como as que foram geradas com os comandos rand, eye, ones e zeros, é dada por:
Função Matriz
[]
Matriz Vaziaeye Matriz identidade
rand Matriz com elementos aleatórios uniformemente distribuídos entre 0 e 1.
zeros Matriz cujos elementos são iguais a zero.
ones Matriz cujos elementos são iguais a um.
hilb Matriz de Hilbert
invhild Inversa da Matriz de Hilbert pascal Matriz do triângulo de
pascal.
hadamard Matriz de Hadamard vander Matriz de Vandermond compan Matriz companheira OPERAÇÕES SOBRE MATRIZES As operações algébricas entre escalares e vetores são definidas como a seguir:
>> v = [1 2 3 4]
v =
1 2 3 4
>> t = 50*ones(1,4) t =
50 50 50 50
>> s = 10:10:40 s =
10 20 30 40
>> s*v' ans = 300
>> s'*v ans =
10 20 30 40 20 40 60 80 30 60 90 120 40 80 120 160
>> s-v ans =
9 18 27 36
>> s.*v ans =
10 40 90 160
>> (v./s).*t ans =
5 5 5 5
>> v.^2 ans =
1 4 9 16
>> t.^v ans =
50 2500 125000 6250000
Um resumo das operações com elementos de escalares, vetores e matrizes são dadas pela tabela a seguir.
Seja um escalar k, os vetores
a a
n
a
1
, b b
n
b
1
e as matrizesc
ijC
eD d
ij, então:Operação Resultado
k
a a
1 k a
n k
b
a b
1 k b
n k
k
a * a
1* k a
n* k
b
a . * a
1* b
1 a
n* b
n
b
a . / a
1/ b
1 a
n/ b
n
k
a.^ a
1^ k a
n^ k
a
k.^ k ^ a
1 k ^ a
n
b
a.^ a
1^ b
1 a
n^ b
n
'
* b
a
n
i i i
b a
1
b
a'* R r
ij a
i* b
jk
C c
ij k D
C c
ij d
ijk
C * c
ij* k D
C *
nk
kj ik
ij
c b
r R
1
*
D
C . * c
ij* d
ijD
C . / c
ij/ d
ijk
C . / c
ij/ k k
C.^ c
ij^ k k
C^ C
kC
k.^ k ^ c
ijD
C^ c
ij^ d
ijOs comandos min, max, mean, std, var e cov aplicados em matrizes funcionam como se as mesmas fossem coleções de vetores colunas.
>> A
A =
1 2 3 4 5 6 7 8 9
>> mean(A) ans = 4 5 6
>> max(A) ans = 7 8 9
Para matrizes, o comando find pode devolver índices de duas formas:
>> find(A > 6) ans =
3 6 9
>> [i,j] = find(A > 6) i =
3 3 3
j = 1 2 3
Para saber quais são as dimensões de uma matriz utilize os comandos size ou length:
>> A = [1 2 3; 4 5 6]
A =
1 2 3 4 5 6
>> size(A) ans = 2 3
>> size(A,1) ans = 2
>> size(A,2) ans = 3
>> length(A) ans = 3
Basicamente, size(A) retorna um vetor cujo primeiro elemento é o número de linhas de A e o segundo elemento é o número de colunas de A. Para matrizes, o comando length(A) é equivalente ao comando composto max(size(A)). Caso a matriz A seja vazia, então, todos os comandos irão retornar o valor zero.
EXERCÍCIOS
(1) Digite a matriz quadrada (3x3) cujo elemento (i,j) é igual à i+j.
(2) Armazene no espaço de trabalho os seguintes valores:
132 .
3
a , b e
2, c i
2,
3 4 . 5 . 46
d ,
2 . 3 0 pi / 2
d ,
1 0
81 . 9
f ,
i pi
i e g
*
* 4
8 12
,
24 51
9
12 4
2 1
2 5
. 2 32 . 0
e
pi
A ,
43 13
0
74 65 . 4 32
87 34 5
B .
(3) Verifique o resultado das seguintes operações:
(i) a + b + f.
(ii) d – f.
(iii) e’ + 3*f.
(iv) g – c*f (v) f*g’ + A (vi) d*f – a/b (vii) A*B (viii) a*(A./b).
(ix) a*A-B/a (x) f*B
(4) O que acontece com A < 10 para a matriz A anterior ? Como é feita esta comparação ?
(5) Sejam as matrizes:
0 23 83 14
12 11 10 9
8 7 6 5
4 3 2 1
A e
0 10 1 . 0
3 2 01 . 4
0 4
.
7 pi
B
Atribua:
(i) O elemento a
32à variável c.
(ii) O elemento b
22à variável c.
(iii) Os elementos a
11, a
12e a
13à um vetor d.
(iv) A terceira coluna da matriz B a um vetor d.
(v) A segunda linha de B à primeira de A. Dica: preencha os espaços restantes com 0.
(vi) A quarta linha de A à segunda linha de A.
(6) Extrair das matrizes do exercício (5) as submatrizes:
(i) Apenas a primeira e a última coluna de A.
(ii) Os elementos que estão entre a segunda e terceira coluna de A e entre a primeira e segunda linha de A.
(iii) Os elementos que estão na primeira linha da matriz B.
(7) Das matrizes do exercício (5) extrair os elementos das matrizes A e B que são:
(i) Maiores que 5.
(ii) Diferentes de 3 e 5.
(iii) Iguais a 2, 5, 8 e 9.
(iv) Elementos cujo resto da divisão por 3 é 1. Dica: utilize a função rem.
(8) Gerar os seguintes vetores:
(i) x começa em 0, vai até 15 e passo 1.
(ii) x começa em –3.4, vai até 8 e passo 0.32.
(iii) x começa em 10, vai até 1 e passo –1.23.
(iv) x começa em 0, vai até 15
2, passo 10*pi.
(9) Seja o vetor x=1:10. Verifique as afirmativas:
(i) (x.^2) = =(x.*x).
(ii) any((x.^3)>(3*x)).
(iii) all((x./(x+1))>((x+1)./(x+1.5))).
(iv)A = [1 2 3; 4 5 6; 7 8 9]; A^2 =
= A.^2.
MRP2011