This repository has been archived on 2023-03-25. You can view files and clone it, but cannot push or open issues or pull requests.
mightyscape-1.1-deprecated/extensions/fablabchemnitz/papercraft/openjscad/node_modules/sylvester/README.md

193 lines
4.1 KiB
Markdown
Raw Normal View History

# 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