Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@lightrabbit/ml-matrix

mljs8MIT5.2.5TypeScript support: included

Matrix manipulation and computation library

matrix, decomposition, SVD, singular, value, EVD, eigenvalue, LU, Qr, Cholesky, data, mining, datamining, machine, learning

readme

ml-matrix

NPM version build status Test coverage npm download

Matrix manipulation and computation library.

Installation

$ npm install --save ml-matrix

Usage

As an ES module

import Matrix from 'ml-matrix';

const matrix = Matrix.ones(5, 5);

As a CommonJS module

const { Matrix } = require('ml-matrix');

const matrix = Matrix.ones(5, 5);

API Documentation

Examples

Standard operations

const { Matrix } = require('ml-matrix');

var A = new Matrix([[1, 1], [2, 2]]);
var B = new Matrix([[3, 3], [1, 1]]);
var C = new Matrix([[3, 3], [1, 1]]);

// ============================
// Operations with the matrix :
// =============================

// operations :
const addition = Matrix.add(A, B); // addition = Matrix [[4, 4], [3, 3], rows: 2, columns: 2]
const substraction = Matrix.sub(A, B); // substraction = Matrix [[-2, -2], [1, 1], rows: 2, columns: 2]
const multiplication = A.mmul(B); // multiplication = Matrix [[4, 4], [8, 8], rows: 2, columns: 2]
const mulByNumber = Matrix.mul(A, 10); // mulByNumber = Matrix [[10, 10], [20, 20], rows: 2, columns: 2]
const divByNumber = Matrix.div(A, 10); // divByNumber = Matrix [[0.1, 0.1], [0.2, 0.2], rows: 2, columns: 2]
const modulo = Matrix.mod(B, 2); // modulo = Matrix [[ 1, 1], [1, 1], rows: 2, columns: 2]
const maxMatrix = Matrix.max(A, B); // max = Matrix [[3, 3], [2, 2], rows: 2, columns: 2]
const minMatrix = Matrix.min(A, B); // max = Matrix [[1, 1], [1, 1], rows: 2, columns: 2]

// Inplace operations : (consider that Cinit = C before all the operations below)
C.add(A); // => C = Cinit + A
C.sub(A); // => C = Cinit
C.mul(10); // => C = 10 * Cinit
C.div(10); // => C = Cinit
C.mod(2); // => C = Cinit % 2

// Standard Math operations : (abs, cos, round, etc.)
var A = new Matrix([[1, 1], [-1, -1]]);
var expon = Matrix.exp(A); // expon = Matrix [[Math.exp(1), Math.exp(1)], [Math.exp(-1), Math.exp(-1)], rows: 2, columns: 2].
var cosinus = Matrix.cos(A); // cosinus = Matrix [[Math.cos(1), Math.cos(1)], [Math.cos(-1), Math.cos(-1)], rows: 2, columns: 2].
var absolute = Matrix.abs(A); // expon = absolute [[1, 1], [1, 1], rows: 2, columns: 2].
// you can use 'abs', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'cbrt', 'ceil', 'clz32', 'cos', 'cosh', 'exp', 'expm1', 'floor', 'fround', 'log', 'log1p', 'log10', 'log2', 'round', 'sign', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc'
// Note : you can do it inplace too as A.abs()

// ============================
// Manipulation of the matrix :
// =============================

var numberRows = A.rows; // A has 2 rows
var numberCols = A.columns; // A has 2 columns
var firstValue = A.get(0, 0); // get(rows, columns)
var numberElements = A.size; // 2 * 2 = 4 elements
var isRow = A.isRowVector(); // false because A has more that 1 row
var isColumn = A.isColumnVector(); // false because A has more that 1 column
var isSquare = A.isSquare(); // true, because A is 2 * 2 matrix
var isSym = A.isSymmetric(); // false, because A is not symmetric
// remember : A = Matrix [[1, 1], [-1, -1], rows: 2, columns: 2]
A.set(1, 0, 10); // A = Matrix [[1, 1], [10, -1], rows: 2, columns: 2]. We have change the second row and the first column
var diag = A.diag(); // diag = [1, -1], i.e values in the diagonal.
var m = A.mean(); // m = 2.75
var product = A.prod(); // product = -10, i.e product of all values of the matrix
var norm = A.norm(); // norm = 10.14889156509222, i.e Frobenius norm of the matrix
var transpose = A.transpose(); // tranpose = Matrix [[1, 10], [1, -1], rows: 2, columns: 2]

// ============================
// Instanciation of matrix :
// =============================

var z = Matrix.zeros(3, 2); // z = Matrix [[0, 0], [0, 0], [0, 0], rows: 3, columns: 2]
var z = Matrix.ones(2, 3); // z = Matrix [[1, 1, 1], [1, 1, 1], rows: 2, columns: 3]
var z = Matrix.eye(3, 4); // Matrix [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], rows: 3, columns: 4]. there are 1 only in the diagonal

Maths :

const {
  Matrix,
  inverse,
  solve,
  linearDependencies,
  QrDecomposition,
  LuDecomposition,
  CholeskyDecomposition
} = require('ml-matrix');

//===========================
// inverse and pseudo-inverse
//===========================

var A = new Matrix([[2, 3, 5], [4, 1, 6], [1, 3, 0]]);
var inverseA = inverse(A);
var B = A.mmul(inverseA); // B = A * inverse(A), so B ~= Identity

// if A is singular, you can use SVD :
var A = new Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]); // A is singular, so the standard computation of inverse won't work (you can test if you don't trust me^^)
var inverseA = inverse(A, (useSVD = true)); // inverseA is only an approximation of the inverse, by using the Singular Values Decomposition
var B = A.mmul(inverseA); // B = A * inverse(A), but inverse(A) is only an approximation, so B doesn't really be identity.

// if you want the pseudo-inverse of a matrix :
var A = new Matrix([[1, 2], [3, 4], [5, 6]]);
var pseudoInverseA = A.pseudoInverse();
var B = A.mmul(pseudoInverseA).mmul(A); // with pseudo inverse, A*pseudo-inverse(A)*A ~= A. It's the case here

//=============
// Least square
//=============

// Least square is the following problem : We search x, such as A.x = b (A, x and b are matrix or vectors).
// Below, how to solve least square with our function

// If A is non singular :
var A = new Matrix([[3, 1], [4.25, 1], [5.5, 1], [8, 1]]);
var b = Matrix.columnVector([4.5, 4.25, 5.5, 5.5]);
var x = solve(A, b);
var error = Matrix.sub(b, A.mmul(x)); // The error enables to evaluate the solution x found.

// If A is non singular :
var A = new Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
var b = Matrix.columnVector([8, 20, 32]);
var x = solve(A, b, (useSVD = true)); // there are many solutions. x can be [1, 2, 1].transpose(), or [1.33, 1.33, 1.33].transpose(), etc.
var error = Matrix.sub(b, A.mmul(x)); // The error enables to evaluate the solution x found.

//===============
// Decompositions
//===============

// QR Decomposition

var A = new Matrix([[2, 3, 5], [4, 1, 6], [1, 3, 0]]);
var QR = QrDecomposition(A);
var Q = QR.orthogonalMatrix;
var R = QR.upperTriangularMatrix;
// So you have the QR decomposition. If you multiply Q by R, you'll see that A = Q.R, with Q orthogonal and R upper triangular

// LU Decomposition

var A = new Matrix([[2, 3, 5], [4, 1, 6], [1, 3, 0]]);
var LU = LuDecomposition(A);
var L = LU.lowerTriangularMatrix;
var U = LU.upperTriangularMatrix;
var P = LU.pivotPermutationVector;
// So you have the LU decomposition. P includes the permutation of the matrix. Here P = [1, 2, 0], i.e the first row of LU is the second row of A, the second row of LU is the third row of A and the third row of LU is the first row of A.

// Cholesky Decomposition

var A = new Matrix([[2, 3, 5], [4, 1, 6], [1, 3, 0]]);
var cholesky = CholeskyDecomposition(A);
var L = cholesky.lowerTriangularMatrix;

// Eigenvalues & eigenvectors

var A = new Matrix([[2, 3, 5], [4, 1, 6], [1, 3, 0]]);
var e = EigenvalueDecomposition(A);
var real = e.realEigenvalues;
var imaginary = e.imaginaryEigenvalues;
var vectors = e.eigenvectorMatrix;

//=======
// Others
//=======

// Linear dependencies
var A = new Matrix([
  [2, 0, 0, 1],
  [0, 1, 6, 0],
  [0, 3, 0, 1],
  [0, 0, 1, 0],
  [0, 1, 2, 0]
]);
var dependencies = linearDependencies(A); // dependencies is a matrix with the dependencies of the rows. When we look row by row, we see that the first row is [0, 0, 0, 0, 0], so it means that the first row is independent, and the second row is [ 0, 0, 0, 4, 1 ], i.e the second row = 4 times the 4th row + the 5th row.

License

MIT

changelog

5.2.1 (2019-01-07)

Bug Fixes

  • correct matrix.d.ts to follow TypeScript 3 (#81) (99329fd)

5.2.0 (2018-09-25)

Bug Fixes

  • complete type definitions (ca63059)

Features

5.1.1 (2018-05-11)

Bug Fixes

5.1.0 (2018-05-04)

Features

  • add linearDependencies method (88ee3df)

Performance Improvements

  • add transposeViewMul benchmark (0d24ea9)

5.0.1 (2017-07-28)

Bug Fixes

5.0.0 (2017-07-21)

Code Refactoring

  • change decompositions to classes (00c18e8)

BREAKING CHANGES

  • Now decompositions have to be created with "new".

4.0.0 (2017-07-19)

Code Refactoring

  • remove dependency on ml-array-utils (1e7119d)

Features

  • add norm method (#57) (221391a)
  • add useSVD parameter to the solve function (#56)
  • allows to select only rows or columns as view (#51) (46eb916)
  • wrap: create a 2D or 1D WrapperMatrix (#52) (7900d67)

BREAKING CHANGES

  • The new ml-array-rescale dependency removes support for Node 4

3.0.0 (2017-04-25)

BREAKING CHANGES

  • The library has been migrated to ES module syntax. The different parts are now available as named exports.
  • The solve and inverse methods have been removed from the Matrix prototype and are now only available as individual exports.

2.3.0 (2017-02-28)

Features

  • add pseudoinverse function based on SVD (3279a15)

2.2.0 (2016-12-14)

Bug Fixes

  • Matrix and Lu circular dependency (ab706b9)
  • styling issues picked up by Travis CI (f211a1f)

Features

  • det: add 2x2 and 3x3 determinants (04ae195)
  • det: add determinant based on LU decomposition (90532ef)
  • det: add determinant synonym (5395b56)
  • sum: sum by 'row' or 'column' (bf5d070)

2.1.0 (2016-10-07)

Bug Fixes

  • use Symbol.species as Matrix constructor in selection (fee325e)
  • use Symbol.species in evaluated static methods (39800f9)

Features

  • add fast multiplication algorithm (strassen) (fdc1c07)
  • add maxValue option to Matrix.randInt (e5a8541)
  • add value parameter to Matrix.eye (f52e4fd)
  • implement optimized algorithm for 2x2 and 3x3 multiplication (4055ef9)

2.0.0 (2016-08-04)

Features

  • add column view (5ff6680)
  • add concept of abstract matrix (cbefc9b)
  • add flipColumn and flipRow views (55ee4a6)
  • add method subMatrixView (aa1df18)
  • add row view (a9e99f2)
  • add selection method and selection view (59aa861)
  • add transposeView (fb0a0c9)
  • make use of Symbol.species to allow creating new matrices in any class (eaee5de)

BREAKING CHANGES

  • This is a non trivial change and could potentially break existing code. There is no known backward incompatibility though.

1.4.0 (2016-08-03)

Features

  • add method setSubMatrix (89b4242)
  • add method with one argument template (b66ee9f)
  • add repeat method (8b9eecb)

1.3.0 (2016-07-25)

Features

  • add methods scaleRows and scaleColumns (8516f83)

1.2.1 (2016-07-07)

Bug Fixes

  • do not use rest parameters (2c4502e)

1.2.0 (2016-07-07)

Features

  • add support for Math.pow (2524b73)

1.1.5 / 2016-05-31

  • EVD: add assumeSymmetric option

1.1.4 / 2016-05-27

  • add support of Symbol.species for Chrome 51

1.1.2 / 2016-05-18

  • fix EVD bug introduced in last version

1.1.1 / 2016-05-18

  • make EVD compatible with SparseMatrix

1.1.0 / 2016-05-13

  • add kroneckerProduct method

1.0.4 / 2015-11-21

  • only include src directory on publish

1.0.3 / 2015-11-19

  • random not correctly filling rectangular matrices

1.0.2 / 2015-10-05

  • remove const and let for Safari support

1.0.0 / 2015-09-10

  • rename xxxFactor to xxxMatrix in decompositions
  • add static min and max methods
  • add fullname synonyms for some methods
  • support all arithmetic operators and Math functions including static versions
  • convert project to use ES2015 classes
  • fix abs method not returning this

0.1.0 / 2015-06-11

  • use standard errors, remove MatrixError
  • implement getColumnVector and getRowVector

0.0.4 / 2015-06-11

  • authorize call of decompositions without new
  • fix bug in svd.inverse
  • check for matrix argument in mmul

0.0.3 / 2015-04-24

  • use Array.isArray

0.0.2 / 2015-03-16

  • add matrix.inverse() and matrix.solve(other)

0.0.1 / 2014-10-24

  • first release