Skip to content

Instantly share code, notes, and snippets.

@bellbind
Last active March 18, 2022 13:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bellbind/4498ba3f04f69af33b5df1c67df78ed2 to your computer and use it in GitHub Desktop.
Save bellbind/4498ba3f04f69af33b5df1c67df78ed2 to your computer and use it in GitHub Desktop.
[javascript] math functions for regular matrix as flat array
import {det, adjugate as adj, inv, mulmm} from "./mat.js";
{
const a = [1, 2, 3, 4];
console.log(det(2, a));
console.log(adj(2, a));
console.log(inv(2, a));
console.log(mulmm(2, inv(2, a), a));
const b = [0, 1, 2, 7, 8, 3, 6, 5, 4];
console.log(det(3, b));
console.log(adj(3, b));
console.log(inv(3, b));
console.log(det(3, inv(3, b)));
console.log(mulmm(3, inv(3, b), b));
const c = [0, 1, 2, 3, 11, 12, 13, 4, 10, 15, 14, 5, 9, 8, 7, 6];
console.log(det(4, c));
console.log(adj(4, c));
console.log(inv(4, c));
console.log(det(4, inv(4, c)));
console.log(mulmm(4, inv(4, c), c));
}
// math functions for regular matrix as a flat array
export const range = n => [...Array(n).keys()];
export const sum = a => a.reduce((s, v) => s + v, 0);
export const addmm = (m1, m2) => m1.map((e, i) => e + m2[i]);
export const elem = (n, m) => (r, c) => m[r * n + c];
export const mulmm = (n, m1, m2) => range(n).flatMap(r => range(n).map(c => sum(range(n).map(i => elem(n, m1)(r, i) * elem(n, m2)(i, c)))));
export const mulsm = (n, s, m) => m.map(e => s * e);
export const mulmv = (n, m, v) => range(n).map(r => sum(range(n).map(i => elem(n, m)(r, i) * v[i])));
export const mulvm = (n, v, m) => range(n).map(i => sum(range(n).map(c => v[i] * elem(n, m)(i, c))));
export const minor = (n, m) => (r, c) => m.filter((v, idx) => {
const x = idx % n;
return x !== c && (idx - x) / n !== r;
});
export const det = (n, m) => n === 0 ? 1 : sum(range(n).map(i => [1, -1][i % 2] * elem(n, m)(0, i) * det(n - 1, minor(n, m)(0, i))));
export const adjugate = (n, m) => range(n).flatMap(r => range(n).map(c => [1, -1][(c + r) % 2] * det(n - 1, minor(n, m)(c, r))));
export const inv = (n, m) => mulsm(n, 1 / det(n, m), adjugate(n, m));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment