next up previous contents
Seguinte: Procedimentos Acima: Alguns códigos lineares com Anterior: Um pouco de aritmética   Conteúdo

Matrizes e afins

O comando matrix cria uma matriz de ordem pré-definida. A sua sintaxe é a seguinte:

matrix(m, n, [[a11, a12, ...], [a21, a22, ...], ...])

O vectores coluna e linha são definidos atribuindo, respectivamente, os valores $ n=1$ e $ m=1$ .
» A:=matrix(2,2,[[1,2],[2,4]]);

De facto, pode-se abdicar da informação 2,2 já que a matriz tem as entradas definidas explicitamente:
» A:=matrix([[1,2],[2,4]]);

É relevante aqui referir-se a livraria linalg de ferramentes de apoio à álgebra linear. Por exemplo, permite-nos obter a factorização LU de $ A$ :
» linalg::factorLU(A);

Os vários comandos desta livraria estão assim disponíveis:
» ?linalg

Sendo tedioso a escrita repetitiva de linalg::comando, pode-se optar por exportar a livraria em bloco
» export(linalg);
ficando assim todos os comandos disponíveis de uma forma mais expedita.

» nullspace(A);

Certamente que o leitor pôde prever o resultado ao rever a factorização LU obtida mais acima. É desnecessário o cálculo do determinante, mas se for incrédulo tente
» det(A);

Atente que a livraria foi exportada para o kernel, caso contrário teria que digitar
» linalg::det(A);

As entradas da matriz são acedidas assim:
» A[1,2];

2

Considere agora os vectores-linha
» a:=matrix([1,0,3,4]);
» b:=matrix([1,2,3,4]);

Vamos criar um ``array'' c que apenas tem como propósito armazenar informação:
» c:=array(1..4);
Como resposta, o utilizador é informado que as entradas não estão especificadas. Nada de útil se processa no ciclo seguinte:
» i:=0:
while i<4 do

i:=i+1:

c[i]:=a[i]*b[i]:
end_while:
eval(c);

O comando eval tem como objectivo mostrar o conteúdo de c. As mudanças de linha são feitas por shift+return, se estiver a usar o x-mupad em linux, ou o mupad no Windows. Em vez de um ciclo while poder-se-ia ter optando por um for:
» for i from 1 to 4 do

c[i]:=a[i]*b[i]:
end_for:
eval(c);

Dom::Matrix(R) cria o domínio das matrizes cujas componentes estão em R. Por exemplo,
» MatZ2:=Dom::Matrix(Dom::IntegerMod(2));
cria o domínio (ou categoria) das matrizes sobre $ {\mathbb{Z}}_2$ , que denominámos por MatZ2. É óbvio que a denominação fica ao critério do utilizador. Não se esqueça de alguns pontos-chave, como a clareza (se começar a denominar os domínios de forma aleatória, será uma veradeira confusão encontrar, posteriormente, o que pretende), nem usar termos proprietários do mupad (uma forma de contornar este problema é usar algumas letras maiúsculas - recorde que é case-sensitive).

Por exemplo, suponha que pretende definir a matriz $ A=\left[\begin{array}{ccccc}
1&0&1&0&1 0&1&0&1&1 \end{array}\right]$ enquanto matriz sobre $ {\mathbb{Z}}_2$ . Nada mais simples:
» G:=MatZ2([[1,0,1,0,1],[0,1,0,1,1]]);

Suponha agora que pretende calcular o espaço nulo, nG, desta matriz, e respectiva dimensão:
» nG:=linalg::nullspace(G);
» nops(nG)

O vector $ i$ dessa base pode ser chamado usando nG[i].

Uma instrução de grande utilidade é a de concatenação de matrizes, quer seja a de linhas ou a de colunas. Suponhamos que se prentende definir uma nova matriz $ A=\left[\begin{array}{c\vert c}I_2 &G\end{array}\right]$ .
» I2:=matrix::identity(2);
» I2:=coerce(I2,MatZ2);

A segunda instrução tem como propósito transformar a matriz identidade $ 2\times 2$ , por defeito real, numa sobre $ {\mathbb{Z}}_2$ . Façamos agora a concatenação horizontalmente:
» A:=linalg::concatMatrix(I2,G);

Se se pretendesse concatenar verticalmente, far-se-ia uso de linalg::stackMatrix. Explore a ajuda sempre que necessário!


next up previous contents
Seguinte: Procedimentos Acima: Alguns códigos lineares com Anterior: Um pouco de aritmética   Conteúdo
2006-12-21