Elixir-Linear-Algebra

Vector and matrix-operations implemented in Elixir. The goal of Elixir-Linear-Algebra (ELA for short) is to provide a complete and consistend set of functions for basic linear algebra operations. Should you want to contribute you are more than welcome to!

Implementation

The implementation for both vectors and matrices use Elixir lists, which under the hood are linked lists. Because of this accessing individual elements takes linear time.

Vector operations

Addition

iex> Vector.add([1, 2, 1], [2, 2, 2])
[3, 4, 3]

Subtraction

iex> Vector.sub([1, 2, 1], [2, 2, 2])
[-1, 0, -1]

Multiplication with scalar

iex> Vector.scalar([2, 2, 2], 2)
[4, 4, 4]

Dot product

iex> Vector.dot([1, 2, 1], [2, 2, 2])
8

Cross product

iex> Vector.cross([1, 2, 1], [2, 2, 2])
[2, 0, -2]

Transpose

iex> Vector.transp([1, 1, 1])
[[1],
 [1],
 [1]]

Matrix operations

Creation

iex> Matrix.new(3, 2)
[[0, 0],
 [0, 0],
 [0, 0]]

Identity matrix

iex> Matrix.identity(3)
[[1, 0, 0],
 [0, 1, 0],
 [0, 0, 1]]

Addition

iex> Matrix.add([[1, 2, 3],
                 [1, 1, 1]],
                [[1, 2, 2],
                 [1, 2, 1]])
[[2, 4, 5],
 [2, 3, 2]]

Subtraction

iex> Matrix.sub([[1, 2, 3],
                 [1, 2, 2]],
                [[1, 2, 3],
                 [2, 2, 2]])
[[0, 0, 0],
 [-1, 0, 0]]

Multiplication with scalar

iex> Matrix.scalar([[2, 2, 2],
                    [1, 1, 1]], 2)
[[4, 4, 4],
 [2, 2, 2]]

Multiplication with vector

iex> Matrix.mult([1, 1], [[1, 0, 1],
                          [1, 1, 1]])
[[2, 1, 2]]
iex> Matrix.mult([[1, 0, 1],
                  [1, 1, 1]],
                 [[1],
                  [1],
                  [1]])
[[2],
 [3]]

Multiplication with matrix

iex> Matrix.mult([[1, 2],
                  [1, 1]],
                 [[1, 2],
                  [0, 2]])
[[1, 6],
 [1, 4]]

Transpose

iex> Matrix.transp([[1, 2, 3],
                    [4, 5, 6]])
[[1, 4],
 [2, 5],
 [3, 6]]

Pivoting

iex> Matrix.pivot([[2.0, 3.0],
                   [2.0, 3.0],
                   [3.0, 6.0]], 1, 0)
[[0.0, 0.0],
 [1.0, 1.5],
 [0.0, 1.5]]

Reduced row echelon form

iex> Matrix.reduce([[1.0, 1.0, 2.0, 1.0],
                    [2.0, 1.0, 6.0, 4.0],
                    [1.0, 2.0, 2.0, 3.0]])
[[1.0, 0.0, 0.0, -5.0],
 [0.0, 1.0, 0.0, 2.0],
 [0.0, 0.0, 1.0, 2.0]]