# Introduction to la4j

### Introduction

la4j - is open source single-threaded and 100% java library for solving problems of linear algebra. It supports sparse and dense matrices and covers almost all of the linear algebra tasks.

la4j was written by author in process of learning Calculation Math in one Russian university.

### Features

There are following features of current version of la4j:

- uniform interpretation of vectors and matrices;
- sparse (CSR) and dense (2d array) matrices and vectors support;
- basic vectors and matrices operations (addition, multiplying, transposing and other);
- linear systems solving (Gaussian Elimination, Jacobi, Gauss-Seidel and other);
- matrices decomposition (SVD, LU, Cholesky and other);
- inverted matrix foundation;
- matrices and vectors serialization;
- I/O for vectors and matrices support (MatrixMarket format);

In addition la4j now is **55** classes, **6700** loc, **90** tests, **50** kb (in jar).

### Matrices and Vectors

See bellow la4j core class diagram.

*Figure 1. la4j core class diagram*

la4j provides flexible API for working with matrices and vectors through factories - `DenseFactory`

and `SparseFactory`

. Here is an example:

```
Factory denseFactory = new DenseFactory();
Factory sparseFactory = new SparseFactory();
double array[][] = new double[][] {
{1.0, 0.0, 0.0},
{0.0, 5.0, 0.0},
{0.0, 0.0, 9.0}
};
Matrix a = sparseFactory.createMatrix(array);
Matrix b = denseFactory.createMatrix(array);
Matrix c = a.copy(denseFactory); // convert sparse to dense
Matrix d = b.copy(sparseFactory); // convert dense to sparse
```

Here is an example of basic operations:

```
Matrix a = sparseFactory.createMatrix(array);
Matrix b = denseFactory.createMatrix(array);
Matrix c = a.multiply(b); // c - is sparse matrix
Matrix d = a.multiply(b, denseFactory); // d - is dense matrix
Matrix e = c.add(d).subtract(a).multiply(100); // c + d - a * 100
Matrix f = a.transpose(); // f - is sparse matrix
Matrix g = a.transpose(denseFactory); // g - is dense matrix
```

### Linear Systems

la4j supports most of popular calculation methods for solving linear systems. See bellow design of la4j.linear package.

*Figure 2. la4j.linear package class diagram*

As You can see `la4j.linear`

package implement Strategy design pattern.

Here is an example of solving linear systems in la4j:

```
Matrix a = denseFactory.createMatrix(array);
Vector b = sparseFactory.createVector(array[0]);
LinearSystem system = new LinearSystem(a, b);
Vector x = system.solve(new GaussianSolver()); // x - is dense vector
Vector y = system.solve(new JacobiSolver(), sparseFactory); // y - is sparse vector
```

### Matrix decomposition

There are a lot of matrix decomposition methods available in `la4j.decomposition`

package.

*Figure 2. la4j.decomposition package class diagram*

This package implemented in terms of Strategy design pattern.

Here is an example how to use la4j for matrix decomposition:

```
Matrix a = denseFactory.createMatrix(array);
Matrix[] qr = a.decompose(new QRDecompositor()); // qr[0] = Q, qr[1] = R; Q,R - dense matrices
Matrix[] lu = a.decompose(new LUDecompositor(), sparseFactory); // lu[0] = L, lu[1] = U; L,U - sparse matrices
```

### Input/Output

la4j supports I/O operations through la4j.io package. It is implements Bridge Design pattern.

In current implementation supports MatrixMarket format. Here is an example of output for matrix:

```
0 1 0
0 2 0
0 3 0
```

For dense matrix it will be:

```
%%MatrixMarket matrix array real general
3 3
0
1
0
0
2
0
0
3
0
```

For sparse matrix it will be:

```
%%MatrixMarket matrix coordinate real general
3 3 3
0 1 1
1 1 2
2 1 3
```

la4j provides two classes: `MMInputStream`

and `MMInputStream`

, which can be used instead `ObjectInputStream`

and `ObjectOutputStream`

in serialization algorithms. For example:

```
Matrix a = denseFactory.createMatrix(array);
ObjectOutput mmos = new MMOutputStream(new FileOutputStream("file.mm"));
mmos.writeObject(a);
mmos.close();
ObjectInput mmis = new MMInputStream(new FileInputStream("file.mm"));
Matrix b = (Matrix) mmis.readObject();
mis.close();
```

### Resources

- la4j.java.net - la4j at java.net
- la4j.googlecode.com - la4j at Google Code
- la4j.blogspot.com - la4j at Blogger

*(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)*