Last active
March 18, 2022 13:48
-
-
Save bellbind/4498ba3f04f69af33b5df1c67df78ed2 to your computer and use it in GitHub Desktop.
[javascript] math functions for regular matrix as flat array
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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