# Linear Algebra¶

## Fields¶

The fields F2 = ModP<int, 2>, F3 = ModP<int, 3>, and F5 = ModP<int, 5> are supported. Additional fields can be added to libbats.cpp if desired.

from bats import F2
print(F2(1) + F2(1)) # should be 0


## Vectors¶

Sparse vectors for each supported field class are available: F2Vector, F3Vector, etc. as well as an IntVector.

The easiest way to construct these vectors is from a list of tuples, where each tuple contains a index-value pair (where the value is an integer - it will be cast to the relevant field).

from bats import F2Vector
v = F2Vector([(0,1), (2,1)])


## Matrices¶

### CSCMatrix¶

A = bats.CSCMatrix(2,2,[0,1,2],[0,1],[-1,-1])
A.print() # prints matrix
A(0,0) # returns -1


To construct a CSCMatrix using scipy.sparse:

import scipy.sparse as sparse

# create 2x2 identity matrix
data = [1, 1]
row = [0,1,2]
col = [0, 1]
A = sparse.csc_matrix((data, col, row), shape=[2,2])

# create BATS CSCMatrix
Ab = bats.CSCMatrix(*A.shape, A.indptr, A.indices, A.data)


You could also construct the scipy.sparse csc_matrix in a variety of different ways before passing to BATS.

### Column Matrices¶

Column matrices can be created from CSCMatrix

A = bats.CSCMatrix(2,2,[0,1,2],[0,1],[1,1]) # 2x2 identity
C = bats.IntMat(A)
C2 = bats.F2Mat(A)
C3 = bats.F3mat(A)
CQ = bats.RationalMat(A)


You can also use bats.Mat and pass in the field.

C = bats.Mat(A) # IntMat
C = bats.Mat(A, bats.F2()) # F2Mat


In order to get the contents of a ColumnMatrix in Python, use the tolist() method

C.tolist()


You can add columns of the appropriate type to a column matrix

A = bats.F2Mat(3,0)
A.append_column(bats.F2Vector([(0,1), (1,1)]))
A.append_column(bats.F2Vector([(0,1), (2,1)]))
A.append_column(bats.F2Vector([(1,1), (2,1)]))
np.array(A.tolist()) # this will display the matrix in a nice way


To generate an identity matrix, just pass the desired size and relevant field type to bats.Identity

I = bats.Identity(3, bats.F2())


### Dense Matrices¶

BATS dense matrices are by default stored in row major order to be compatible with numpy.

import bats
import numpy as np
Bnp = np.array([[0,1,2],[3,4,5]], dtype=np.float)
B = bats.Matrix(Bnp)
Bnp2 = np.array(B)