Consulte também o vídeo explicativo sobre Matrizes e Vetores em Scilab.
Matrizes e vetores são facilmente escritos e manipulados no Scilab. Na escrita de uma matriz ou vetor, tem-se:
v = [2, 3, 4]
e w = [2 3 4]
são idênticosAo digitar uma matriz ou vetor, inserimos entre colchetes [ ]
para indicar que é uma matriz ou vetor; Depois, para acessarmos as posições de matrizes ou vetores, informamos as posições entre parêntesis ()
.
Vejamos alguns exemplos de escritas de vetores e matrizes no Scilab.
Exemplo - Escrita de um vetor linha
// criação de um vetor linha
v = [20 30 40]
// imprimindo o primeiro elemento na tela
disp(v(1))) // o resultado será 20
// modificando o segundo elemento para 100
v(2) = 100
// imprimindo o vetor na tela
disp(v) // o resultado será [20, 100, 40]
Exemplo - Escrita de um vetores coluna
// criação de um vetor coluna
u = [2 ; 3 ; 4]
// criação de um vetor coluna com Enter
w = [2;
3;
4]
// os vetores acima são iguais. Podemos fazer a comparação da seguinte forma:
disp(u == v) // o resultado seráá [T ;T ;T], de true (verdadeiro)
Exemplo - Escrita de uma matriz
// criação de uma matriz 3x4
A = [10, 20 , 30, 40;
50; 60; 70, 80;]
90; 100; 110; 120]
// imprimindo na tela o elemento (3,2)
disp(A(3,2)) // o resultado será 100
Escreva uma matriz $ A\left(i,j\right) = i+j $, de 4 por 3 por uso de loops.
Solução
Considere por exemplo o seguinte código
A = zeros(4,3)
for i=1:4
for j=1:3
A(i,j) = i+j+2
end
end
disp(A)
Que gera o seguinte resultado.
2. 3. 4.
3. 4. 5.
4. 5. 6.
5. 6. 7.
Os seguintes comandos podem ser utilizados para criar matrizes/vetores:
Operação | Descrição |
---|---|
zeros(n,m) | cria uma matriz de n linhas e m colunas de 0's |
ones(n,m) | cria uma matriz de n linhas e m colunas de 1's |
eye (n,m) | cria uma matriz identidade de n linhas e m colunas |
Crie uma matriz de 0's, 1's e a matriz identidade, todas de 5 por 5.
disp('Matriz de zeros')
disp(zeros(5,5))
disp('-----')
disp('Matriz de ums')
disp(ones(5,5))
disp('-----')
disp('Matriz identidade')
disp(eye(5,5))
Que gera os seguintes resultados:
"Matriz de 0's"
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
0. 0. 0. 0. 0.
"-----"
"Matriz de 1's"
1. 1. 1. 1. 1.
1. 1. 1. 1. 1.
1. 1. 1. 1. 1.
1. 1. 1. 1. 1.
1. 1. 1. 1. 1.
"-----"
"Matriz identidade"
1. 0. 0. 0. 0.
0. 1. 0. 0. 0.
0. 0. 1. 0. 0.
0. 0. 0. 1. 0.
0. 0. 0. 0. 1.
Os seguintes comandos permitem a extração de matrizes e vetores no Scilab.
Operação | Descrição |
---|---|
length(M) | número de elementos |
size(M) | número de linhas e colunas |
Vejamos um exemplo
Seja a matriz
$$ A = \begin{pmatrix} 1 & 2&3&4&5 \cr 6&7&8&9&10 \cr 11&12&13&14&15 \cr 16&17&18&19&20 \end{pmatrix} $$Obtenha o número de linhas e colunas e o número de elementos.
Solução
Em Scilab, o seguinte código permite obter o número de linhas e colunas e o número de elementos.
A = [1, 2, 3, 4, 5;
6, 7, 8, 9, 10;
11, 12, 13, 14, 15;
16, 17, 18, 19, 20]
[n,m] = size(A) // número de linhas e colunas
nelem = length(A) // número de elementos
disp(n)
disp(m)
disp(nelem)
O resultado é 4 linhas, 5 colunas e 20 elementos.
Podemos referenciar submatrizes ou subvetores facilmente no Scilab. Para uma matriz, a vírgula separa a referência a linhas e colunas. O dois pontos indica todo o intervalo:
Quando inserimos números, designamos todo o intervalo compreendido entre os números:
Podemos também nos referir a intervalos específicos, com vetores de posição.
Ou alternativamente definir estes vetores de posição antes e usarmos na matriz:
Extraia as linhas 1,3 e colunas 2,4,5 da matriz a seguir.
$$ A = \begin{pmatrix} 1 & 2&3&4&5 \cr 6&7&8&9&10 \cr 11&12&13&14&15 \cr 16&17&18&19&20 \end{pmatrix} $$Solução
O código a seguir extrai as linhas e colunas conforme informado no enunciado:
A = [1, 2, 3, 4, 5;
6, 7, 8, 9, 10;
11, 12, 13, 14, 15;
16, 17, 18, 19, 20]
disp(A([1,3],[2,4,5]))
O resultado gerado é:
2. 4. 5.
12. 14. 15.
Operação | Descrição |
---|---|
find(M) | Encontra condições verdadeiras em uma matriz de booleanos |
max(M) | máximo elemento e sua posição correspondente na matriz M |
mix(M) | mínimo elemento e sua posição correspondente na matriz M |
O comando find
pode ser empregado para retornar as posições em que dada condição é satisfeita. Considere um exemplo.
Na matriz a seguir, encontre quais elementos são menores do que zero.
$$ A = \begin{pmatrix} 1 & -2&3&-4&5 \cr 6&-7&8&-9&10 \cr 11&12&13&14&15 \cr 16&17&18&19&20 \end{pmatrix} $$Solução
Em Scilab, podemos obter as posições correspondentes a linhas e colunas menores do que zero da forma:
A = [1, -2, 3, -4, 5;
6, -7, 8, -9, 10;
11, 12, 13, 14, 15;
16, 17, 18, 19, 20]
// posições de linhas e colunas <0
[posl,posc] = find(A<0)
// ou em contagem contínua
pos = find(A<0)
//escreve as posições de linhas e colunas
disp([posl',posc',pos'])
Os resultados obtidos são (note que na contagem contínua, o Scilab conta os elementos por colunas, ex, o elemento da linha 1 coluna 2 é o 5º elemento, o da linha 2 coluna 2 é 6º elemento, e assim por diante):
linha / coluna / contagem continua
1 2 5
2 2 6
1 4 13
2 4 14
Observe que uma forma sucinta de modificar elementos que satisfaçam a dada condição na matriz pode ser feita conforme o exemplo a seguir.
Na matriz a seguir, torne os números negativos nulos.
$$ A = \begin{pmatrix} 1 & -2&3&-4&5 \cr 6&-7&8&-9&10 \cr 11&12&13&14&15 \cr 16&17&18&19&20 \end{pmatrix} $$Solução
Com o seguinte código é possível tornar números negativos nulos.
A = [1, -2, 3, -4, 5;
6, -7, 8, -9, 10;
11, 12, 13, 14, 15;
16, 17, 18, 19, 20]
// vamos mostrar três formas
// forma 1
[posl,posc] = find(A<0)
A(posl,posc) = 0
// forma 2
pos = find(A<0)
A(pos) = 0
// forma 3, mais sucinta
A(A<0) = 0
O resultado obtido é:
1 0 3 0 5
6 0 8 0 10
11 12 13 14 15
16 17 18 19 20
As seguintes operações podem efetuar modificações e transformações de matrizes
Operação | Descrição |
---|---|
u' ou M' | forma transposta de matrizes e vetores |
matrix(M,nlin,col) | equivalente ao reshape, redimensiona uma matriz M para uma forma de nlin e ncol |
repmat(M,nlin,col) | repete uma matriz um número de linhas e colunas |
gsort(M) | reordena uma matriz M em ordem crescente ou decrescente |
A transposta de matrizes e vetores é feita com o uso do apóstrofe '
. Vejamos um exemplo.
Considere a matriz a seguir
$$ A = \begin{pmatrix} 1 & 2&3&4&5 \cr 6&7&8&9&10 \cr 11&12&13&14&15 \cr 16&17&18&19&20 \end{pmatrix} $$Obtenha sua transposta no Scilab.
A = [1, 2, 3, 4, 5;
6, 7, 8, 9, 10;
11, 12, 13, 14, 15;
16, 17, 18, 19, 20]
disp(A') // forma transposta da matriz
Que gera o seguinte resultado:
1. 6. 11. 16.
2. 7. 12. 17.
3. 8. 13. 18.
4. 9. 14. 19.
5. 10. 15. 20.
O comando matrix
permite o redimensionamento de matrizes em dado número de linhas e colunas (claramente o número de elementos da matriz original deve ser igual à multiplicação do número e linhas e colunas desejado). Vejamos um exemplo.
Redimensione a seguinte matriz 4 x 5 (ou seja, com 20 elementos).
$$ A = \begin{pmatrix} 1 & 2&3&4&5 \cr 6&7&8&9&10 \cr 11&12&13&14&15 \cr 16&17&18&19&20 \end{pmatrix} $$Em uma matriz de 2 linhas e 10 colunas com o comando matrix
Solução
O código em Scilab fica:
A = [1, 2, 3, 4, 5;
6, 7, 8, 9, 10;
11, 12, 13, 14, 15;
16, 17, 18, 19, 20]
disp(matrix(A,2,10))
Que gera o seguinte resultado:
1. 11. 2. 12. 3. 13. 4. 14. 5. 15.
6. 16. 7. 17. 8. 18. 9. 19. 10. 20.
Observe que a contagem da sequência dos elementos é por coluna, e não por linha.
Com o comando repmat
repita a matriz
2 vezes nas linhas e 3 vezes nas colunas.
Solução
O código em Scilab fica:
A = [1, 2, 3, 4, 5;
6, 7, 8, 9, 10;
11, 12, 13, 14, 15;
16, 17, 18, 19, 20]
disp(repmat(A,2,3))
O resultado gerado é (as linhas horizontais e verticais foram apresentadas apenas para facilitar a visualização):
$$ \begin{array}{c|c|c} \begin{array}{ccccc} 1 & 2 & 3 & 4 & 5 \cr 6 & 7 & 8 & 9 & 10 \cr 11 & 12 & 13 & 14 & 15 \cr 16 & 17 & 18 & 19 & 20 \end{array} & \begin{array}{ccccc} 1 & 2 & 3 & 4 & 5 \cr 6 & 7 & 8 & 9 & 10 \cr 11 & 12 & 13 & 14 & 15 \cr 16 & 17 & 18 & 19 & 20 \end{array} & \begin{array}{ccccc} 1 & 2 & 3 & 4 & 5 \cr 6 & 7 & 8 & 9 & 10 \cr 11 & 12 & 13 & 14 & 15 \cr 16 & 17 & 18 & 19 & 20 \end{array} \cr \hline \begin{array}{ccccc} 1 & 2 & 3 & 4 & 5 \cr 6 & 7 & 8 & 9 & 10 \cr 11 & 12 & 13 & 14 & 15 \cr 16 & 17 & 18 & 19 & 20 \end{array} & \begin{array}{ccccc} 1 & 2 & 3 & 4 & 5 \cr 6 & 7 & 8 & 9 & 10 \cr 11 & 12 & 13 & 14 & 15 \cr 16 & 17 & 18 & 19 & 20 \end{array} & \begin{array}{ccccc} 1 & 2 & 3 & 4 & 5 \cr 6 & 7 & 8 & 9 & 10 \cr 11 & 12 & 13 & 14 & 15 \cr 16 & 17 & 18 & 19 & 20 \end{array} \end{array} $$O ordenamento crescente ou decrescente de matrizes e vetores pode ser obtido com o comando gsort
.
Vejamos um exemplo.
Seja o vetor:
$$ v = \begin{pmatrix} 10 & 30 & 100 & 80 & 70 & 50 \end{pmatrix} $$Obtenha o vetor reordenado em ordem crescente e as posições dos elementos no vetor original
Solução
Com o comando gsort
, podemos efetuar o ordenamento como:
v = [10 , 30 , 100 , 80 , 70 , 50]
// reordenamento segundo o metodo geral 'g' e crescente 'i' (de increasing)
[valores,posicao]=gsort(v,'g','i')
disp(valores) // valores em ordem crescente
disp(posicao) // posição dos elementos no vetor original
Os resultados obtidos para os valores ordenados e sua posição no vetor original ficam:
valores
10. 30. 50. 70. 80. 100.
posição
1. 2. 6. 5. 4. 3.
Com o comando gsort
, o segundo argumento permite informar o tipo de reordenamento, se g
é o reordenamento geral, se r
é o reordenamento em que as linhas aparecem em ordem (crescente) e se c
se as colunas devem aparecer em ordem crescente.
Efetue o reordenamento em ordem crescente em linhas da seguinte matriz:
Solução
O código a seguir efetua o reordenamento em ordem crescente nas linhas.
A = [7 , 4, 8;
6 , 2 ,9]
disp(gsort(A,'c','i'))
O resultado gerado é:
4. 7. 8.
2. 6. 9.
Vale lembrar da regra necessária para que uma multiplicação matricial seja possível
No scilab, ao fazer a multiplicação de duas matrizes A
e B
, podemos simplesmente usar o A*B
Considere por exemplo a seguinte multiplicação matricial
$$ \mathbf{A} = \begin{pmatrix} 1 & 2 & 3 \cr 4 & 5 & 6 \cr 7 & 8 & 9 \cr 10 & 11 & 12 \end{pmatrix} $$$$ \mathbf{B} = \begin{pmatrix} 1 & 2 & 3 & 4 \cr 5 & 6 & 7 & 8 \cr 9 & 10 & 11 & 12 \end{pmatrix} $$Fazendo:
$$ \mathbf{C} = \mathbf{A} \cdot \mathbf{B} = \begin{pmatrix} 1 & 2 & 3 \cr 4 & 5 & 6 \cr 7 & 8 & 9 \cr 10 & 11 & 12 \end{pmatrix} \cdot \begin{pmatrix} 1 & 2 & 3 & 4 \cr 5 & 6 & 7 & 8 \cr 9 & 10 & 11 & 12 \end{pmatrix} $$Em Scilab, pode-se efeutar a multiplicação acima da seguinte forma:
A = [1,2,3,4;
5,6,7,8;
9,10,11,12]
B = [1,2,3;
4,5,6;
7,8,9;
10,11,12]
C = A * B
disp(C)
O resultado será:
70. 80. 90.
158. 184. 210.
246. 288. 330.
As operações precedidas por um ponto (.
) representam no Scilab operações elemento a elemento entre duas matrizes (ou vetores) de dimensões iguais. Considere por exemplo duas matrizes A
e B
de mesma dimensão n por m
. Então
A .* B
efetua a multiplicação elemento a elementoA ./* B
efetua a divisão elemento a elementoA .^ B
efetua a divisão potenciaçãoAs operações de soma
e subtração
elemento a elemento não são precedidas por ponto, ou seja:
A + B
efetua a soma elemento a elementoA - B
efetua a subtração elemento a elemento Considere as matrizes A
e B
a seguir.
Faça a multiplicação e a soma elemento a elemento.
Solução
A multiplicação elemento a elemento fica:
$$ \mathbf{C} = \mathbf{A} \odot \mathbf{B} = \begin{pmatrix} 1 & 2 & 3 \cr 4 & 5 & 6 \cr 7 & 8 & 9 \cr 10 & 11 & 12 \end{pmatrix} \odot \begin{pmatrix} 10 & 20 & 30 \cr 40 & 50 & 60 \cr 70 & 80 & 90 \cr 100 & 110 & 120 \end{pmatrix} = \begin{pmatrix} 1 \cdot 10 & 2\cdot 20 & 3\cdot 30 & 4 \cdot 40 \cr 5 \cdot 50 & 6 \cdot 60 & 7 \cdot 70 & 8 \cdot 80 \cr 9 \cdot 90 & 10 \cdot 100 & 11 \cdot 110 & 12 \cdot 120 \end{pmatrix} $$$$ \mathbf{C} = \begin{pmatrix} 10 & 40 & 90 \cr 160 & 250 & 360 \cr 490 & 640 & 810 \cr 1000 & 1210 & 1440 \end{pmatrix} $$A soma elemento a elemento fica:
$$ \mathbf{D} = \mathbf{A} + \mathbf{B} = \begin{pmatrix} 1 & 2 & 3 \cr 4 & 5 & 6 \cr 7 & 8 & 9 \cr 10 & 11 & 12 \end{pmatrix} + \begin{pmatrix} 10 & 20 & 30 \cr 40 & 50 & 60 \cr 70 & 80 & 90 \cr 100 & 110 & 120 \end{pmatrix} = \begin{pmatrix} 1 + 10 & 2+ 20 & 3+ 30 \cr 4 + 40 & 5 + 50 & 6 + 60 \cr 7 + 70 & 8 + 80 & 9 + 90 \cr 10 + 100 & 11 + 110 & 12 + 120 \end{pmatrix} $$$$ \mathbf{D} = \begin{pmatrix} 11 & 22 & 33 \cr 44 & 55 & 66 \cr 77 & 88 & 99 \cr 110 & 121 & 132 \end{pmatrix} $$No Scilab, a multiplicação e a soma elemento a elemento seriam feitas como:
A = [1,2,3;
4,5,6;
7,8,9,
10,11,12]
B = [10,20,30;
40, 50,60;
70,80; 90;
100,110,120]
C = A .* B // mulitiplicação elemento a elemento
disp('multiplicação')
disp(C)
D = A + B // soma elemento a elemento
disp('soma')
disp(D)
Que gera o seguinte resultado:
"multiplicação"
10. 40. 90.
160. 250. 360.
490. 640. 810.
1000. 1210. 1440.
"soma"
11. 22. 33.
44. 55. 66.
77. 88. 99.
110. 121. 132.
Uma série de funções matemáticas e estatísticas estão disponíveis para serem efetuadas sobre matrizes/vetores. Alguns exemplos estão ilustrados a seguir.
Operação | Descrição |
---|---|
cumprod(M) | produto cumulativo da matriz M |
cumsum(M) | soma cumulativa da matriz M |
norm(M) | norma da matriz M |
sign(M) | sinal dos elementos da matriz M |
sum(M) | soma dos elementos da matriz M |
mean(M) | média dos elementos da matriz M |
stdev(M) | média dos elementos da matriz M |
Em um teste de peneira, considere o histograma de frequência da massa de partículas ilustrada a seguir
Diâmetro da abertura em que a massa ficou retida (mm) |
Massa retida (g) |
---|---|
0 fundo da peneira | 5.2 |
10 | 8.3 |
20 | 15.3 |
30 | 20.7 |
40 | 16.4 |
50 | 10.1 |
60 | 4.2 |
70 | 0.8 |
Monte a distribuição cumulativa de massa.
Solução
Para tanto, na coluna da massa, basta fazer a soma cumulativa e dividir pela soma total.
diam = [0, 10, 20, 30, 40, 50, 60, 70]
massa = [5.2, 8.3, 15.3, 20.7, 16.7, 10.1, 4.2, 0.8]
// probabilidade cumulativa
prob = cumsum(massa) / sum(massa)
// imprime os valores na tela
disp([diam;prob])
O resultado está apresentado a seguir:
diam 0. 10. 20. 30. 40. 50. 60. 70.
prob 0.0639606 0.1660517 0.3542435 0.6088561 0.8142681 0.9384994 0.9901599 1.
O Scilab também dispõe de operações referentes à conjuntos aplicados sobre vetores e matrizes, ilustradas a seguir.
Operação | Descrição |
---|---|
intersect(A, B) | retorna os elementos comuns (intersecção) entre A e B |
union(A,B) | retorna a união dos elementos entre A e B |
setdiff(A,B) | retorna os elementos contidos em A e não contidos em B |
unique(A) | retorna valores únicos na matriz A |
Vejamos um exemplo
Considere os vetores a seguir.
$$ u = \begin{pmatrix} 1 & 2 & 3 & 4 & 5 & 6 & 7 \end{pmatrix} $$$$ v = \begin{pmatrix} 2 & 4 & 6 & 8 & 10 \end{pmatrix} $$Efetue a intersecção, a união e a diferença entre os conjuntos A e B.
Solução
O seguinte código permite
// união
u = [1 , 2 , 3 , 4 , 5 , 6 , 7]
v = [2, 4 , 6, 8, 10]
// intesecção
disp(intersect(u,v))
// união
disp(union(u,v))
// diferença u-v
disp(setdiff(u,v))
Os resultados obtidos são:
// intesercção
2. 4. 6.
// união
1. 2. 3. 4. 5. 6. 7. 8. 10.
// diferença u-v
1. 3. 5. 7.
Um conjunto deve conter apenas valores não repetidos. Considere então o vetor
$$ u = \begin{pmatrix} 2 & 2 & 5 & 4 & 5 & 6 & 7 \end{pmatrix} $$Determine o conjunto que pode ser extraído deste vetor (com o comando unique
)
Solução
O código a seguir obtém os valores únicos do vetor.
u = [2, 2, 5, 4 , 5 6 ,7 ]
disp(unique(u))
Que gera o resultado a seguir.
2. 4. 5. 6. 7.