UNPKG

ml-matrix

Version:

Matrix manipulation and computation library

213 lines (191 loc) 4.89 kB
import { newArray } from './util'; export function sumByRow(matrix) { let sum = newArray(matrix.rows); for (let i = 0; i < matrix.rows; ++i) { for (let j = 0; j < matrix.columns; ++j) { sum[i] += matrix.get(i, j); } } return sum; } export function sumByColumn(matrix) { let sum = newArray(matrix.columns); for (let i = 0; i < matrix.rows; ++i) { for (let j = 0; j < matrix.columns; ++j) { sum[j] += matrix.get(i, j); } } return sum; } export function sumAll(matrix) { let v = 0; for (let i = 0; i < matrix.rows; i++) { for (let j = 0; j < matrix.columns; j++) { v += matrix.get(i, j); } } return v; } export function productByRow(matrix) { let sum = newArray(matrix.rows, 1); for (let i = 0; i < matrix.rows; ++i) { for (let j = 0; j < matrix.columns; ++j) { sum[i] *= matrix.get(i, j); } } return sum; } export function productByColumn(matrix) { let sum = newArray(matrix.columns, 1); for (let i = 0; i < matrix.rows; ++i) { for (let j = 0; j < matrix.columns; ++j) { sum[j] *= matrix.get(i, j); } } return sum; } export function productAll(matrix) { let v = 1; for (let i = 0; i < matrix.rows; i++) { for (let j = 0; j < matrix.columns; j++) { v *= matrix.get(i, j); } } return v; } export function varianceByRow(matrix, unbiased, mean) { const rows = matrix.rows; const cols = matrix.columns; const variance = []; for (let i = 0; i < rows; i++) { let sum1 = 0; let sum2 = 0; let x = 0; for (let j = 0; j < cols; j++) { x = matrix.get(i, j) - mean[i]; sum1 += x; sum2 += x * x; } if (unbiased) { variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1)); } else { variance.push((sum2 - (sum1 * sum1) / cols) / cols); } } return variance; } export function varianceByColumn(matrix, unbiased, mean) { const rows = matrix.rows; const cols = matrix.columns; const variance = []; for (let j = 0; j < cols; j++) { let sum1 = 0; let sum2 = 0; let x = 0; for (let i = 0; i < rows; i++) { x = matrix.get(i, j) - mean[j]; sum1 += x; sum2 += x * x; } if (unbiased) { variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1)); } else { variance.push((sum2 - (sum1 * sum1) / rows) / rows); } } return variance; } export function varianceAll(matrix, unbiased, mean) { const rows = matrix.rows; const cols = matrix.columns; const size = rows * cols; let sum1 = 0; let sum2 = 0; let x = 0; for (let i = 0; i < rows; i++) { for (let j = 0; j < cols; j++) { x = matrix.get(i, j) - mean; sum1 += x; sum2 += x * x; } } if (unbiased) { return (sum2 - (sum1 * sum1) / size) / (size - 1); } else { return (sum2 - (sum1 * sum1) / size) / size; } } export function centerByRow(matrix, mean) { for (let i = 0; i < matrix.rows; i++) { for (let j = 0; j < matrix.columns; j++) { matrix.set(i, j, matrix.get(i, j) - mean[i]); } } } export function centerByColumn(matrix, mean) { for (let i = 0; i < matrix.rows; i++) { for (let j = 0; j < matrix.columns; j++) { matrix.set(i, j, matrix.get(i, j) - mean[j]); } } } export function centerAll(matrix, mean) { for (let i = 0; i < matrix.rows; i++) { for (let j = 0; j < matrix.columns; j++) { matrix.set(i, j, matrix.get(i, j) - mean); } } } export function getScaleByRow(matrix) { const scale = []; for (let i = 0; i < matrix.rows; i++) { let sum = 0; for (let j = 0; j < matrix.columns; j++) { sum += matrix.get(i, j) ** 2 / (matrix.columns - 1); } scale.push(Math.sqrt(sum)); } return scale; } export function scaleByRow(matrix, scale) { for (let i = 0; i < matrix.rows; i++) { for (let j = 0; j < matrix.columns; j++) { matrix.set(i, j, matrix.get(i, j) / scale[i]); } } } export function getScaleByColumn(matrix) { const scale = []; for (let j = 0; j < matrix.columns; j++) { let sum = 0; for (let i = 0; i < matrix.rows; i++) { sum += matrix.get(i, j) ** 2 / (matrix.rows - 1); } scale.push(Math.sqrt(sum)); } return scale; } export function scaleByColumn(matrix, scale) { for (let i = 0; i < matrix.rows; i++) { for (let j = 0; j < matrix.columns; j++) { matrix.set(i, j, matrix.get(i, j) / scale[j]); } } } export function getScaleAll(matrix) { const divider = matrix.size - 1; let sum = 0; for (let j = 0; j < matrix.columns; j++) { for (let i = 0; i < matrix.rows; i++) { sum += matrix.get(i, j) ** 2 / divider; } } return Math.sqrt(sum); } export function scaleAll(matrix, scale) { for (let i = 0; i < matrix.rows; i++) { for (let j = 0; j < matrix.columns; j++) { matrix.set(i, j, matrix.get(i, j) / scale); } } }