Operações matriciais básicas no Scilab

O básico do básico …

No Scilab, basicamente, todas as operações são realizadas de forma vetorial ou matricial. Vetores, na realidade, são apenas um caso especial de uma matriz com uma única linha e N colunas. Ou seja, o tipo de variável de um vetor é exatamente o mesmo tipo de uma variável matriz. Essa é uma simplificação que não existe em outras linguagens como C ou Python. Na realidade, para quem não está interessado em detalhes de implementação computacional, é ótimo. Os delimitadores de uma matriz são os colchetes “[ ]”. E os delimitadores de elementos e linhas são, respectivamente “,” e “;”. É possível também utilizar espaço como delimitador de elementos e “Enter” como delimitador de linha. Assim, se desejarmos representar a seguinte matriz $M$:

\[
M
=
\begin{bmatrix}
1 & 3\\
5 & 7
\end{bmatrix}
\]

No Scilab, $M$ seria escrita em uma das seguintes formas:

Scilab
//Forma de representar uma matriz
M=[1,3;5,7]
//ou
M=[1 3;5 7]
//ou
M=[1 3
   5 7]
//ou   
M=[1,3
   5,7]

Acessando os elementos de uma matriz

Para acessar os elementos de uma matriz, basta passar o nome da variável seguido de () com o número da linha e coluna do elemento separados por uma virgula. Por exemplo, no caso da matriz $M$, se desejarmos acessar apenas o primeiro elemento da segunda linha da matriz, basta fazer:

Scilab
//chamada do elemento da linha 2 e coluna 1 de m
//seu valor numérico deve ser igual a 5
M(2,1) // -> 5

Uma observação importante, os indices dos elementos de uma matriz no Scilab não começa do zero, como no caso de C, C++, python, etc. O menor índice (linha ou coluna) de um elemento de uma matriz é 1 e não zero. Esse é um padrão adotado geralmente em notações matemática, em sistemas computacionais o mais comum é começar por 0. Os elementos armazenados em matrizes e vetores também podem ser acessados de forma sequencial (como se fosse apenas um vetor) passando apenas um índice. Exemplo:

Scilab
//Acessando sequencialmente os elementos de m
M(1) // -> 1
M(2) // -> 5
M(3) // -> 3
M(4) // -> 7

Notem que a forma como os elementos de matriz $M$ são armazenados na memória do Scilab é completamente diferente da forma como elementos de um array são armazenados em C ou Python. No Scilab, o armazenamento sequencial é por coluna da matriz $m$ em C ou Python é por linha. Esse é uma herança de FORTRAN! E também é uma notação com inspiração em notações matemáticas, onde os vetores são sempre do tipo coluna.

Para realizar o acesso a submatrizes ou partições de uma matriz podemos utilizar alguns caracteres especiais no lugar dos números das linhas e colunas de uma matriz. O carácter “\$” é utilizado para representar a última posição de um índice (linha ou coluna). E o carácter “:” significa todos os indices (linhas ou colunas). Assim, por exemplo, se for desejado criar uma nova matriz criada a partir de todas as linhas da última coluna da matriz $M$ poderíamos fazer:

Scilab
//Todas as linhas da última coluna de m
M(:,$) // -> [3;7]

Intervalos de linha e coluna também podem ser especificados com o auxilio do “:” ( <índice inicial>:<índice final> ). Abaixo segue um outro exemplo com uma matriz $A$ e outras possibilidades de seleção de submatrizes.

Scilab
A=[1,2,3
   4,5,6,
   7,8,9]

c1=A(:,1) // -> [1;4;7]
c2=A(:,2) // -> [2;5;8]
c3=A(:,3) // -> [3;6;9]

l1=A(1,:) // -> [1,2,3]
l2=A(2,:) // -> [4,5,6]
l3=A(3,:) // -> [7,8,9]

S1=A(1:2,1:2) // -> [1,2;4,5]
S2=A(2:3,2:3) // -> [5,6;8,9]

s3=A(:) // [1;4;7;2;5;8;3;6;9]

Tipos especiais de matrizes

No Scilab há também quatro funções especiais para criar novas matrizes são: zeros, ones, eye e rand. Nestes 4 casos é necessário passar como referência ou as dimensões de linhas e colunas desejadas ou uma matriz já existente para servir como referência de linhas e colunas. No primeiro caso, a função zeros(m, n) cria uma matriz com m linhas e n colunas e todos os elementos iguais a zero. No caso da função ones(m,n), adivinha? Cria uma matriz de m linhas e n colunas onde todos os elementos são iguais a 1. A função eye(m,n) cria uma matriz identidade de m linhas por n colunas. E, por fim, a função rand(m,n) cria uma matriz com m linha e n colunas onde os elementos são valores aleatórios. A função rand(m,n) pode ser configurada para gerar valores aleatórios entre 0 e 1 seguindo uma distribuição uniforme ou valores com média zero e seguindo uma distribuição normal padrão. Abaixo segue alguns exemplos de aplicações destas funções.

Scilab
A1=zeros(3,3) //Matriz 3x3 com todos os elementos iguais a zero.

A2=ones(3,3) //Matriz 3x3 com todos os elementos iguais a 1

A3=eye(3,3) //Matriz identidade 3x3

rand('uniform')
A4=rand(3,3) //Matriz 3x3 com valores aleatórios com distribuição uniforme

rand('normal')
A5=rand(3,3) //Matriz 3x3 com valores aleatórios com distribuição normal.

Operações com matrizes

No Scilab praticamente todas as operações são computadas matricialmente, até mesmo operações escalares ($ \mathbb{R} \rightarrow \mathbb{R} $) podem receber vetores e matrizes como parâmetros! Na realidade, no Scilab, quando uma função escalar qualquer $f(.)$ recebe um vetor ou matriz como parâmetro, a função passa a ser aplicada a cada elemento do vetor ou matriz e produz como resultado um vetor ou matriz com as mesmas dimensões da entrada. Por exemplo:

Scilab
x=[1,2,3,4,5,6,7]
//OBS: log é de base "e" se desejar log base 10 o comando é log10
log(x) //Aplica a função log a cada elemento do vetor x
       //-> [0., 0.6931472, 1.0986123, 1.3862944, 1.6094379, 1.7917595, 1.9459101 ]

x+1 // -> [2, 3, 4, 5, 6, 7, 8 ]
2*x // -> [2, 4, 6, 8, 10,12,14] multiplicação de vetor por escalar
x/2 // -> [0.5, 1, 1.5, 2, 2.5, 3, 3.5]

As operação matriciais básicas, como multiplicação, multiplicação de Hadamard(elemento-a-elemento), transposição, inversa, Inversa de Moore-Penrose (pseudoinversa), determinante, traço e diagonal podem ser resumidos no código ilustrativo logo abaixo.

Scilab
A=[1,1,3
   4,5,6
   7,8,9]
   
x=[1;2;3]

k=3  

//Multiplicação convencional de uma matrizes por um escalar
k*A  // -> [3,   3,  9
     //       12, 15, 18
     //       21, 24, 27]

//Multiplicação convencional de uma matrizes por um vetor
A*x // -> [12;32;50]

//Multiplicação convencional de matrizes
A*A // -> [26, 30, 36 
    //     66, 77, 96
    //    102, 119, 150]

//Multiplicação elemento-a-elemento
A.*A // -> [1, 1, 9
     //     16, 25, 36
     //     49, 64, 81 ]

//Transposta
x'  // -> [1,2,3]

//Inversa de uma matriz
inv(A) // -> [ 0.5 -2.5 1.5
       //      -1   2   -1
       //      0.5  0.1666 -0.1666]

//Pseudoinversa de uma matriz, é igual a inversa quando a matriz é não singular
pinv(A)// -> [ 0.5 -2.5 1.5
       //      -1   2   -1
       //      0.5  0.1666 -0.1666]

//Determinante de A
det(A) // -> -6

//Traço da matriz A
trace(A) // -> 1+5+9=15

//Diagonal da matriz A
diag(A) //-> [1;5;9]


Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *