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:
//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:
//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:
//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:
//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.
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.
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:
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.
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]
Deixe um comentário