212 lines
4.8 KiB
JavaScript
212 lines
4.8 KiB
JavaScript
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);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|