193 lines
4.1 KiB
Markdown
193 lines
4.1 KiB
Markdown
|
# sylvester
|
||
|
|
||
|
Modern and expanded implementation of James Coglan's "Sylvester" matrix math library. The original project can be found at http://sylvester.jcoglan.com/
|
||
|
|
||
|
# Documentation
|
||
|
|
||
|
The original documentation for "Sylvester" should help you through basic operations. An intro that contains node-specific features can also be found {on Chris Umbel's blog}[http://www.chrisumbel.com/article/sylvester_node_js_matrix_vector_math]. We're looking for someone to help get the documentation situation under control.
|
||
|
|
||
|
# Installation
|
||
|
|
||
|
npm install sylvester
|
||
|
|
||
|
# Usage
|
||
|
|
||
|
## New Stuff
|
||
|
|
||
|
First I'd like to show some examples of features that aren't in the standard (non-node) Sylvester. I'll likely attempt to commit these back to Sylvester at some point soon.
|
||
|
|
||
|
Note that the decompositions are all available in pure JavaScript, but if the [lapack](https://github.com/NaturalNode/node-lapack) NPM is installed with LAPACK built as a shared library then efficient native code will be used. The LAPACK integration is still *highly* experimental.
|
||
|
|
||
|
### Vector
|
||
|
|
||
|
require('sylvester');
|
||
|
var a = $V([1, 2, 3]);
|
||
|
|
||
|
element-wise log:
|
||
|
|
||
|
console.log(a.log());
|
||
|
|
||
|
norm computation:
|
||
|
|
||
|
console.log(a.norm());
|
||
|
|
||
|
element-wise multiplication:
|
||
|
|
||
|
a.elementMultiply(vector);
|
||
|
|
||
|
element-wise division:
|
||
|
|
||
|
a.elementDivide(vector);
|
||
|
|
||
|
remove first n nodes:
|
||
|
|
||
|
a.chomp(n);
|
||
|
|
||
|
return vector with first n nodes:
|
||
|
|
||
|
a.top(n);
|
||
|
|
||
|
add all elements into a single scalar:
|
||
|
|
||
|
a.sum()
|
||
|
|
||
|
multiply all elements into a single scalar:
|
||
|
|
||
|
a.product()
|
||
|
|
||
|
return a vector with the elements parameter on the bottom:
|
||
|
|
||
|
a.augment(elements)
|
||
|
|
||
|
### Matrix
|
||
|
|
||
|
var A = $M([[1, 2, 3], [4, 5, 6]]);
|
||
|
|
||
|
return subset of rows, columns:
|
||
|
|
||
|
// startRow, endRow, startCol, endCol
|
||
|
A.slice(2, 3, 2, 3);
|
||
|
|
||
|
divide matricies:
|
||
|
|
||
|
A.div($M([[0.5, 1], [1, 2], [2, 3]]));
|
||
|
|
||
|
scalar addition/subtraction
|
||
|
|
||
|
A.add(1);
|
||
|
A.subtract(1);
|
||
|
|
||
|
element-wise log:
|
||
|
|
||
|
console.log(A.log());
|
||
|
|
||
|
element-wise multiplication:
|
||
|
|
||
|
A.elementMultiply(vector)
|
||
|
|
||
|
add all elements into a single scalar:
|
||
|
|
||
|
A.sum()
|
||
|
|
||
|
returns a vector of the indexes of maximum values ([3 3]):
|
||
|
|
||
|
$M([[1, 2, 3], [5, 4, 6]]).maxColumnIndexes()
|
||
|
|
||
|
returns a vector of minimum column indexes ([1 2]):
|
||
|
|
||
|
$M([[1, 2, 3], [5, 4, 6]]).minColumnIndexes();
|
||
|
|
||
|
returns a vector of max values ([3 6]):
|
||
|
|
||
|
$M([[1, 2, 3], [5, 4, 6]]).maxColumns()
|
||
|
|
||
|
returns a vector of minimum values ([1 4]):
|
||
|
|
||
|
$M([[1, 2, 3], [5, 4, 6]]).minColumns()
|
||
|
|
||
|
create a 2x3 matrix of ones:
|
||
|
|
||
|
var Ones = Matrix.One(2, 3);
|
||
|
|
||
|
LU decomposition (with partial pivoting)
|
||
|
|
||
|
var lu = A.lu();
|
||
|
console.log(lu.L);
|
||
|
console.log(lu.U);
|
||
|
console.log(lu.P);
|
||
|
|
||
|
QR decomposition (feature still inefficient and experimental, but uses pure javascript):
|
||
|
|
||
|
var qr = A.qr();
|
||
|
console.log(qr.Q);
|
||
|
console.log(qr.R);
|
||
|
|
||
|
SVD decomposition (feature still inefficient and experimental, but uses pure javascript):
|
||
|
|
||
|
var svd = A.svd();
|
||
|
console.log(svd.U);
|
||
|
console.log(svd.S);
|
||
|
console.log(svd.V);
|
||
|
|
||
|
PCA
|
||
|
|
||
|
var A = $M([[1, 2], [5, 7]]).pcaProject(1).eql($M([
|
||
|
[-2.2120098720461616],
|
||
|
[-8.601913944732665]
|
||
|
]);
|
||
|
var pca = A.pcaProject(1);
|
||
|
var Z = pca.Z;
|
||
|
var A = Z.pcaRecover(pca.U);
|
||
|
|
||
|
Solving systems of equations
|
||
|
|
||
|
// sovle Ax = b for x
|
||
|
var A = $M([[2, 4], [2, 1]]);
|
||
|
var b = $V([1, 0]);
|
||
|
console.log(A.solve(b));
|
||
|
|
||
|
== Old Stuff
|
||
|
|
||
|
Below is a basic illustration of standard matrix/vector math using the standard
|
||
|
Sylvester API. This documentation is rather incomplete and for further details please consult {the official sylvester API documentation}[http://sylvester.jcoglan.com/docs] at http://sylvester.jcoglan.com/docs.
|
||
|
|
||
|
### Vectors
|
||
|
|
||
|
require('sylvester');
|
||
|
|
||
|
create two vectors:
|
||
|
|
||
|
var a = $V([1, 2, 3]);
|
||
|
var b = $V([2, 3, 4]);
|
||
|
|
||
|
compute the dot product:
|
||
|
|
||
|
var r = a.dot(b);
|
||
|
|
||
|
add two vectors:
|
||
|
|
||
|
var c = a.add(b);
|
||
|
|
||
|
multiply by scalar:
|
||
|
|
||
|
var d = a.x(2);
|
||
|
|
||
|
### Matrices
|
||
|
|
||
|
require('sylvester');
|
||
|
|
||
|
create two matrices:
|
||
|
|
||
|
var A = $M([[1, 2], [3, 4]]);
|
||
|
var B = $M([[1, 2, 3], [4, 5, 6]]);
|
||
|
|
||
|
multiply the matrices:
|
||
|
|
||
|
var C = A.x(B);
|
||
|
|
||
|
transpose a matrix:
|
||
|
|
||
|
var B_T = B.transpose();
|
||
|
// B is 2x3, B_T is 3x2
|
||
|
|