Universidade do Estado do Rio de Janeiro
Instituto de Química
Prof André Luís Alberton
Índice

Matrizes e vetores¶

 Consulte também o vídeo explicativo sobre Matrizes e Vetores em Scilab.

Escrita de vetores e matrizes¶

Matrizes e vetores são facilmente escritos e manipulados no Scilab. Na escrita de uma matriz ou vetor, tem-se:

  • vetores têm orientação (vetor linha e vetor coluna)
  • a vírgula é um separador de elementos de uma mesma linha, sendo opcional podendo ser apenas um espaço entre os elementos. Ex, os vetores v = [2, 3, 4] e w = [2 3 4] são idênticos
  • o ponto e vírgula marca uma nova linha (um Enter passando para a outra linha também marca uma nova linha)

Ao 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

Exemplo -) Escrita de um matriz por loops¶

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.

Criando matrizes por comandos¶

Os seguintes comandos podem ser utilizados para criar matrizes/vetores:


Criação de matrizes
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

Exemplo - Criação de matrizes¶

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.

Extraindo a dimensão de matrizes/vetores¶

Os seguintes comandos permitem a extração de matrizes e vetores no Scilab.


Obtenção de dados da dimensão de uma matriz M
Operação Descrição
length(M) número de elementos
size(M) número de linhas e colunas

Vejamos um exemplo

Exemplo - extraindo as dimensões de uma matriz¶

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.

Extraindo submatrizes e subvetores¶

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:

drawing

Quando inserimos números, designamos todo o intervalo compreendido entre os números:

drawing

Podemos também nos referir a intervalos específicos, com vetores de posição.

drawing

Ou alternativamente definir estes vetores de posição antes e usarmos na matriz:

drawing

Exemplo - Extraindo linhas e colunas¶

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.

Pesquisa em matrizes/vetores¶

Pesquisas em uma matriz M
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.

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.

Exemplo - tornando números negativos nulos em uma matriz¶

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

Transformações e redimensionamentos de matrizes/vetores¶

As seguintes operações podem efetuar modificações e transformações de matrizes


Transformação de uma matriz M
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


Transposta¶

A transposta de matrizes e vetores é feita com o uso do apóstrofe '. Vejamos um exemplo.

Exemplo - Transposta de matriz¶

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.

Redimesionamento¶

O comando matrixpermite 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.

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.

Repetindo a matriz¶

Com o comando repmatrepita 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} $$

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} $$

Reordenamento de matrizes/vetores¶

O ordenamento crescente ou decrescente de matrizes e vetores pode ser obtido com o comando gsort.

Vejamos um exemplo.

Exemplo - reordenamento de um vetor¶

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.

Exemplo - reordenando os elementos nas linhas¶

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:

$$ A = \begin{pmatrix} 7 & 4 & 8 \cr 6 & 2 & 9 \end{pmatrix} $$

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.

Multiplicação matricial¶

Vale lembrar da regra necessária para que uma multiplicação matricial seja possível

drawing

No scilab, ao fazer a multiplicação de duas matrizes A e B, podemos simplesmente usar o A*B

Exemplo - Multiplicação matricial¶

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.

Operações elemento a elemento¶

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 elemento
  • A ./* B efetua a divisão elemento a elemento
  • A .^ B efetua a divisão potenciação

As 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 elemento
  • A - B efetua a subtração elemento a elemento

Exemplo - multiplicação elemento a elemento¶

Considere as matrizes Ae B a seguir.

$$ \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} 10 & 20 & 30 \cr 40 & 50 & 60 \cr 70 & 80 & 90 \cr 100 & 110 & 120 \end{pmatrix} $$

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.

Funções matemáticas/estatísticas¶

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.


Exemplos de operações numéricas sobre uma matriz M
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

Exemplo - soma cumulativa¶

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.

Operações equivalentes a conjuntos¶

O Scilab também dispõe de operações referentes à conjuntos aplicados sobre vetores e matrizes, ilustradas a seguir.


Operações equivalentes a conjuntos em matrizes A, B
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

Exemplo - operações de conjuntos¶

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.

Exemplo - valores únicos¶

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.