Matrices ========= A matrix is represented in atlas using the data type ``mat``. As with vectors, we define a matrix using ``:`` as illustrated below, and listing the entries as sets of n-tuples in order by columns. Note, as for vectors, the ``:`` distinguishes the matrix from an array of integers. For example:: atlas> set A=mat:[[1,2],[3,4]] Identifier A: mat atlas> A Value: | 1, 3 | | 2, 4 | atlas> set B=[[1,2],[3,4]] Identifier B: [[int]] atlas> atlas> B Value: [[1,2],[3,4]] atlas> Note what happens if we add ``A`` and ``B``:: atlas> A+B Internal error: forced value is no vector Evaluation aborted. atlas> Operations on Matrices ----------------------- Multiplication by a vector on the left, (resp. on the right) of ``A``, automatically converts the product into the product of ``A`` by column (resp. row) vector. The transpose of A is obtained using ``^A``:: atlas> A*[1,1] Value: [ 4, 6 ] atlas> [1,1]*A Value: [ 3, 7 ] atlas> ^A Value: | 1, 2 | | 3, 4 | atlas> ``atlas`` has two commands related to the inverse: The first one, ``invert(A)`` gives a pair ``(B,d)`` Where ``B`` is an integral multiple, ``d`` of the inverse of ``A``. If ``A`` is invertible over the integers then ``B`` is the inverse of ``A`` and ``d=1``:: atlas> invert(A) Value: ( | -4, 3 | | 2, -1 | ,2) atlas> atlas> set (B,d)=invert(A) Identifiers B: mat (hiding previous one of type [[int]]), d: int atlas> B Value: | -4, 3 | | 2, -1 | atlas> d Value: 2 atlas> A*B Value: | 2, 0 | | 0, 2 | atlas> atlas> set C=mat:[[1,0],[1,1]] Identifier C: mat atlas> C Value: | 1, 1 | | 0, 1 | atlas> invert(C) Value: ( | 1, -1 | | 0, 1 | ,1) atlas> The second command ``inverse(A)`` is not in the initial software commands. It is defined in the supplementary file ``basic.at``. This command calculates the inverse of a matrix over the integers. Recall that to tell ``atlas`` where to find the ``.at`` files, you need to launch your software using the command ``./atlas --path=atlas-scripts``. If you have not done this yet, you can quit the software and launch it again with this command. You can then input the file ``basic.at`` and continue. Now we can see if we can calculate the inverse of these matrices over the integers :: atlas> A Value: | 1, 3 | | 2, 4 | atlas> inverse(A) Runtime error: Matrix not invertible over the integers (in call of error, built-in) (in call of inverse@mat, defined at atlas-scripts/basic.at:254:4--256:74) Evaluation aborted. atlas> det(A) Value: -2 atlas> C Value: | 1, 1 | | 0, 1 | atlas> inverse(C) Value: | 1, -1 | | 0, 1 | atlas> C*inverse(C) Value: | 1, 0 | | 0, 1 | atlas> Basic Linear Algebra operations ------------------------------- Now lets use a new matrix and try to solve a linear equation. We use the function ``solve``, that has as input, a matrix and a vector; and as output, and array of vectors:: atlas> A:=[[1,0,0],[0,2,0],[1,1,0]] Value: | 1, 0, 1 | | 0, 2, 1 | | 0, 0, 0 | atlas>solve(A,[3,4,0]) Value: [[ -1, 0, 4 ]] atlas> whattype $ type: [vec] atlas> Recall that we use ``$`` to refer to the previous value. The type of the output is not a ``vec``, but rather an array of ``vecs``. In this case, only one ``vec``. Note that the general solution of this matrix equation is a one dimensional vector space. ``atlas`` just chooses a single integer solution of the equation. To find all the solutions you need to find the kernel. If we try to solve an equation with no solutions we would get the empty array:: atlas> solve(A,[0,0,1]) Value: [] atlas> Now we can check our answer. We can do that by identifying the 0th entry of our array as the vector solution of the linear equation. We call this vector ``v``:: atlas> set answer=solve(A,[3,4,0]) Identifier answer: [vec] atlas> answer Value: [[ -1, 0, 4 ]] atlas> set v=answer[0] Identifier v: vec atlas> A*v Value: [ 3, 4, 0 ] atlas> Now let's calculate the kernel of our singular matrix. We use the function ``kernel`` with input a matrix and output another matrix whose columns are a basis of the kernel:: atlas> kernel (A) Value: | 2 | | 1 | | -2 | Note this is a matrix. We can multiply it by A and get 0. However, ``atlas`` will not think of it as a vector solution to the matrix equation. In fact, if we call this matrix w, look what happens when we try to multiply ``v+w`` by A:: atlas> set w= kernel (A) Identifier w: mat atlas> A*(v+w) Error in expression +(v,w) at :36:3-6 Failed to match '+' with argument type (vec,mat) Type check failed We need to rename the column vector of ``w``:: atlas> set u=w[0] Identifier u: vec atlas> u Value: [ 2, 1, -2 ] atlas> atlas> A*(v+u) Value: [ 3, 4, 0 ] atlas> atlas> A*(v+3*u) Value: [ 3, 4, 0 ] atlas> They are all solutions of our matrix equation as was expected. Let's try another matrix:: atlas> A:=[[1,0,0],[0,0,0],[0,0,0]] Value: | 1, 0, 0 | | 0, 0, 0 | | 0, 0, 0 | atlas> kernel (A) Value: | 0, 0 | | 0, 1 | | 1, 0 |