# Introducing JASMAL - My JavaScript Matrix Library

Date: 10-12 2017

Tags: javascript, web

As mentioned in my previous post on
implementing DOA estimation algorithms in the browser, I was working on my own
JavaScript matrix library. Now, I am releasing its source code on my Github.
I named it JASMAL (JAvaScript MAtrix Library)^{[1]}. Initially I thought
it should be a small project because I only need to implement the minimal set of
matrix operations required for the DOA estimation algorithms. It turns out that
the implementation of these DOA estimation algorithms actually requires quite a
lot of matrix operations. Eventually, JASMAL becomes a quite large JavaScript
library, whose file size exceeds 200kB after minimization. To quickly show what
JASMAL can do, I assembled a notebook-like page with the help of CodeMirror
and Plotly:

Note that the actual computations are conducted on a web worker. Therefore you will need a browser that supports
web workers^{[2]}. Here are two more examples demonstrating the capability of
JASMAL:

As highlighted on the Github repository, JASMAL

- can handle both real and complex data
- supports manipulate ndarrays (just like NumPy)
- supports broadcasting for most of the binary operations
- supports a flexible indexing/slicing scheme similar to that of NumPy
- has more than 100 operations implemented

Similar to MATLAB and NumPy, you can create new matrices via `zeros()`

, `ones()`

,
`eye()`

, or from a JavaScript array:

```
let A = T.zeros([3, 4]);
let B = T.ones([4, 4]);
let C = T.eye(5);
let D = T.fromArray([[1, 2], [3, 4]]);
```

Here `T`

is the JASMAL instance. Indexing and slicing is very similar to that of
NumPy:

```
let A = T.zeros([3, 3]);
A.set(0, 1, 10); // Equivalent to A[0, 1] = 10 in NumPy
A.get('::-1', ':'); // Equivalent to A[::-1, :] in NumPy. Reverses all the rows.
A.set([0, -1], ':', 8); // Sets the first and the last row to 8.
```

Note:Because JavaScript does not support overloading indexers, strings representations are used here. Similarly, because JavaScript does not support operator overloading, using JASMAL is more cumbersome than NumPy or MATLAB. For instance, you have to use`T.matmul(A, T.add(B, C))`

instead of`A * (B + C)`

.

JASMAL provides a large collection of functions for

- manipulating ndarrays (e.g.,
`reshape()`

,`tile()`

,`permuteAxis`

) - random number generation (e.g.,
`randn()`

,`unifrnd()`

) - math operations for both real and complex numbers (e.g.
`sin()`

,`log()`

,`acosh()`

) - matrix operations for both real and complex matrices (e.g.,
`matmul()`

,`diag()`

,`det()`

) - matrix decompositions for both real and complex matrices (e.g.,
`svd()`

,`eig()`

,`qr()`

) - statistics (e.g.,
`mean()`

,`var()`

,`hist()`

) - set operations (e.g.,
`setdiff()`

,`union()`

) - polynomials (e.g.,
`polyval()`

,`roots()`

) - ...

For a complete list of references, you are welcomed to check out my Github. I hope you find JASMAL useful :)