# Matrices¶

Create a set of 2x2 matrices where the entries are rational numbers:

In [1]:
MS = MatrixSpace(QQ, 2)
show(MS.dims())


A basis is a set of elements generating the entire set of vectors as linear combinations.

In [2]:
B = MS.basis()
show(list(B))


Now let's create two matrices

In [3]:
A = MS.matrix([1, 2, 3, 4])
B = MS.matrix([4, 3, 3, 4])
show(A)


Matrix multiplication is also quite easy with sagemath

In [4]:
show(A * B)


The same is true for addition

In [5]:
show(A + B)


A special matrix is the identity matrix

In [6]:
I = MS.identity_matrix()
show(I)


Furthermore we do not necessarily need the object MS

In [7]:
m = matrix(QQ, [[1, 2], [4, 5]])
show(m)


It is also possible to create matrix with a lambda function

In [8]:
m = matrix(QQ, 3, 3, lambda r, c: max(r, c))
show(m)


We can create a vector also with a function call:

In [9]:
v = vector((1, 2, 3))
v

Out[9]:
(1, 2, 3)

We can also multiply matrices and vectors using the * operator:

In [10]:
m * v

Out[10]:
(8, 9, 12)

## Linear equation systems¶

A common use of matrices are linear equations. These can be solved using numpy.

The first output is the Hilbert matrix and the second the solution of the linear equation system:

In [11]:
from numpy import linalg
A = matrix.hilbert(2)
show(A)
b = vector((1,1))
x = linalg.solve(A, b)
x = vector(x)
show(x)


Let's verify that sagemath is right:

In [12]:
show(A * x)


You can even solve equations without matrices (example from the sagemath documentation):

In [13]:
var('x,y,z,a')
eqns = [x + z == y, 2*a*x - y == 2*a^2, y - 2*z == 2]
solve(eqns, x, y, z)

Out[13]:
[[x == a + 1, y == 2*a, z == a - 1]]

## Other matrix operations and properties¶

In [14]:
m = matrix(QQ,[[1, 2], [2, 1]])
show(m)
show(m.determinant())

In [15]:
show(A.transpose())

In [16]:
show(m.inverse())


## Eigenvalues and eigenvectors of matrices¶

In [17]:
m.eigenvalues()

Out[17]:
[3, -1]

Eigenvalues are the roots of the characteristic polyonomial:

In [18]:
m.charpoly('l')

Out[18]:
l^2 - 2*l - 3

Eigenvectors for general matrices are given as right-sided vectors and left-sided vectors:

In [19]:
show(m.eigenvectors_right())

In [20]:
show(m.eigenvectors_left())


## Subspaces¶

Subspaces lead us to vectorspaces. This will create a vector space of the dimension 3:

In [21]:
V = VectorSpace(GF(4), 3)
show(V)


Next we create a subspace

In [22]:
S = V.subspace([V([1, 1, 0]), V([4, 0, 1])])


A subspace also has a basis

In [23]:
show(S.basis())