O comando matrix cria uma matriz de ordem pré-definida. A sua sintaxe é a seguinte:
O vectores coluna e linha são definidos atribuindo, respectivamente,
os valores
e
.
» 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
:
» 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];
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
, 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
enquanto matriz sobre
. 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
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
.
» I2:=matrix::identity(2);
» I2:=coerce(I2,MatZ2);
A segunda instrução tem como propósito transformar a matriz identidade
, por defeito real, numa sobre
. 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!