This project is read-only.


Moved to Github, like everyone else.

This site will be slowly dissolved as we convert the documentation to GitHub. Github will show the latest updates. This Mercurial repository will no longer be updated (after May 6th, 2015).



Project Description
While there are already countless math libraries for performing common matrix/array functions, StarMath is distinguished by its simplicity and flexbility. There is no need to declare vectors and matrices in a specific library format. It works simliar to Math.function calls in C#.

The library is small and fully compiles to a Portable Class Library (for all platforms). But is StarMath fast?

Many matrix libraries like to offer short, concise matrix operations (e.g. A*B), but this is not the case with StarMath. As of November 2014, a small adjustment to StarMath (version > 2.0) takes advantage of 'extensions', which allows for concise representations of many functions. Now you can write either:
StarMath.multiply(A, x);

Here are some examples that illustrate ways StarMath has been used to date.

The following are functions built into the library.

Basic Arithmetic

Example usage

multiply(integer/scalar/vector/matrix, integer/scalar/vector/matrix)

Multiplies all elements of a 1D array with the scalar.


divide(vector/matrix, scalar)

Divides all elements of an array by the scalar.


add(vector/matrix, vector/matrix)

Adds arrays A and B


subtract(vector/matrix, vector/matrix)

Subtracts one vector (B) from the other (A). C = A - B.


Vector Multiply


dotProduct(vector, vector)

The dot product of the two 1D vectors A and B


crossProduct(vector, vector)

The cross product of two -precision vectors, A and B,


crossProduct2(vector, vector)

The cross product of two vectors, A and B, which are of length, 2. In actuality, there is no cross-product for 2D. This is shorthand for 2D systems that are really simplifications of 3D. The returned scalar is actually the scalar in the third (read: z) direction.

double z = StarMath.crossProduct2(v1, v2);

multiplyVectorsIntoAMatrix(vector, vector)

Multiply vector by transpose of another vector to create a matrix. Product of each element of array-1 (1D ) with each element of array-2 (1D ) C[i, j] = A[i] * B[j]

double[,] A = StarMath.multiplyVectorsIntoAMatrix(v1, v2);

EltMultiply(vector/matrix, vector/matrix)

The element-by-element (Hadamard) multiplication of vectors or matrices.

double[] v3 = v1.EltMultiply(v2);

Advanced Matrix Manipulation



Computes the singular scalar decomposition of A.

double[] sigma = M.SingularValueDecomposition();
double[,] U, V;
double[] sigma = M.SingularValueDecomposition(out U, out V);


Gets the eigenvalues for matrix, A.

var eigenVectors = new double[size][];
var λ = A.GetEigenValuesAndVectors(out eigenVectors);


Gets the eigenscalars and eigenvectors for matrix, A.


Inverses the matrix A only if the diagonal is all non-zero. A[i, i] != 0.0

double[,] B = A.inverse();


Returns the LU decomposition of A in a new matrix.

double[,] L, U;
StarMath.LUDecomposition(A, out L, out U);


Transposes the matrix, A.

double[,] At = A.transpose();


Returns the determinant of matrix, A.

double detA = A.determinant();

solve(matrix, vector, vector)

Solves for x given matrix, A, vector, b & perhaps an initial guess for x in the formulation: Ax = b

double[] x = StarMath.solve(A, b);

Sizing and Finding



Finds the maximum scalar in the given array and optionally returns the row and column indices along with it.

int rowIndex, colIndex;
double max = A.Max(out rowIndex, out colIndex);


Finds the minimum scalar in the given array and optionally returns the row and column indices along with it.

var min = v1.Min(out index);

find(vector/matrix, scalar)

Finds all the indices for the specified find scalar.

List<int> indices = v1.find(100.0);


Returns to 1-norm (sum of absolute scalars of all terms) of the vector or matrix. Or with two arguments, find the norm2 of their difference.

double diff = StarMath.norm1(v1, v2);


Returns to 2-norm (square root of the sum of squares of all terms) of the vector or matrix (optionally can choose to not do the square root). Or with two arguments, find the norm2 of their difference.

double[,] A;


Returns to p-norm (p-root of the sum of each term raised to the p power)

double[,] A;


Returns the normalized vector (has length (or 2-norm) of 1) of the vector, x.

double[] v1;
v1 = v1.normalize();


Destructively normalizes the vector x.

double[] v1;


Sum up all the elements of a given vector or matrix

var v1 = new[] { 1, 2, 3, 4, 5 };
var avg = v1.sum() / 5.0;


Calculates the standard deviation assuming the whole population is provided (not sample st. dev.).

var v1 = new[] { 1, 2, 3, 4, 5 };
var stdev = v1.standardDeviation();

3D Coordinate Transforms


Translate(scalar, scalar, scalar)

Creates a translated coordinate frame.

double[,] t = StarMath.Translate(1.2, 3.4, 5.6);


Creates a rotation matrix about the X-axis.

double[,] rx45 = StarMath.RotationX(45.0);


Creates a rotation matrix about the Y-axis.

double[,] ry90 = StarMath.RotationY(90.0);


Creates a rotation matrix about the Z-axis.

double[,] rz30 = StarMath.RotationZ(30.0);

Make/Get/Set Methods


makeZero(integer, integer)

Makes the zero vector/matrix of the given dimensions.

double[] g = StarMath.makeZeroVector(3);
double[,] H = StarMath.makeZero(4,3);


Makes an identity matrix of size p by p.

var I = StarMath.makeIdentity(4);

makeLinearProgression(scalar, scalar, scalar)

Makes a linear progression from start to, but not including, the end.

double[] timeSteps = StarMath.makeLinearProgression(100, 0.01);

SetRow(integer, matrix, vector)

Sets/Replaces the given row of matrix A with the vector v.

A.SetRow(0, new[] { 1.0, 2.0, 3.0 });

SetColumn(integer, matrix, vector)

Sets/Replaces the given column of matrix A with the vector v.

A.SetColumn(0, new[] { 1.0, 2.0, 3.0 });

GetColumn(matrix, integer)

Gets the column of matrix, A.

double[] trans = A.GetColumn(4);

GetColumns(vector, matrix)

Get more than one column from a given 2D array.

double[,] rotation = A.GetColumns(new[] { 0, 1, 2 });

GetRow(integer, matrix)

Gets a row of matrix, A.

double[] scale = A.GetRow(4);

GetRows(vector, matrix)

Get more than one row from a given 2D array.

double[,] rotation = A.GetRows(new[] { 0, 1, 2 });

GetPartialVector(vector, vector)

Get some portion of a vector and put in a new vector.

double[] rx = col.GetPartialVector(new[] { 0, 1, 2 });

JoinCol(matrix, matrix)

Joins two 2D arrays side by side and returns the results. The given variables remain unchanged

double[,] AB = A.JoinCol(B);

JoinRow(matrix, matrix)

Joins two 2D arrays one under the other and returns the results. The given variables remain unchanged

double[,] AB = A.JoinRow(B);

JoinVectors(vector, vector)

Concatenates two 1D arrays and returns the result. The given variables remain unchanged

double[,] v12 = v1.JoinVectors(v2);


Joins the matrix columns into vector.

double[,] A;
double[] Avect = A.JoinMatrixColumnsIntoVector();


Joins the matrix rows into vector.

double[] Avect = A.JoinMatrixRowsIntoVector();

MakePrintString(matrix, vector)

Makes the string printing the matrix or vector

Console.WriteLine("A = "+ A.MakePrintString());

Last edited May 6, 2015 at 7:27 PM by mattica, version 17