als-statistics
Version:
A powerful and lightweight JavaScript library for descriptive statistics, regression, clustering, outlier detection, and noise analysis using a flexible table/column architecture.
46 lines (41 loc) • 1.45 kB
JavaScript
const MatrixUtils = {
transpose(A) {
return A[0].map((_, i) => A.map(row => row[i]));
},
multiply(A, B) {
const result = Array.from({ length: A.length }, () => Array(B[0].length).fill(0));
for (let i = 0; i < A.length; i++) {
for (let j = 0; j < B[0].length; j++) {
for (let k = 0; k < B.length; k++) {
result[i][j] += A[i][k] * B[k][j];
}
}
}
return result;
},
multiplyVec(A, b) {
return A.map(row => row.reduce((acc, aij, j) => acc + aij * b[j], 0));
},
inverse(A) {
const n = A.length;
const I = Array.from({ length: n }, (_, i) => Array.from({ length: n }, (_, j) => (i === j ? 1 : 0)));
const AI = A.map((row, i) => [...row, ...I[i]]);
for (let i = 0; i < n; i++) {
let maxRow = i;
for (let k = i + 1; k < n; k++) {
if (Math.abs(AI[k][i]) > Math.abs(AI[maxRow][i])) maxRow = k;
}
[AI[i], AI[maxRow]] = [AI[maxRow], AI[i]];
const diag = AI[i][i];
for (let j = 0; j < 2 * n; j++) AI[i][j] /= diag;
for (let k = 0; k < n; k++) {
if (k !== i) {
const factor = AI[k][i];
for (let j = 0; j < 2 * n; j++) AI[k][j] -= factor * AI[i][j];
}
}
}
return AI.map(row => row.slice(n));
}
};
module.exports = MatrixUtils