UNPKG

@bokeh/bokehjs

Version:

Interactive, novel data visualization

69 lines 2.05 kB
import { min } from "./array"; export class Matrix { nrows; ncols; static __name__ = "Matrix"; _matrix; constructor(nrows, ncols, init) { this.nrows = nrows; this.ncols = ncols; this._matrix = new Array(nrows); for (let y = 0; y < nrows; y++) { this._matrix[y] = new Array(ncols); for (let x = 0; x < ncols; x++) { this._matrix[y][x] = init(y, x); } } } at(row, col) { return this._matrix[row][col]; } *[Symbol.iterator]() { for (let y = 0; y < this.nrows; y++) { for (let x = 0; x < this.ncols; x++) { const value = this._matrix[y][x]; if (value !== undefined) { yield [value, y, x]; } } } } *values() { for (const [item] of this) { yield item; } } map(fn) { return new Matrix(this.nrows, this.ncols, (row, col) => fn(this.at(row, col), row, col)); } apply(obj) { const fn = Matrix.from(obj); const { nrows, ncols } = this; if (nrows == fn.nrows && ncols == fn.ncols) { return new Matrix(nrows, ncols, (row, col) => fn.at(row, col)(this.at(row, col), row, col)); } else { throw new Error("dimensions don't match"); } } to_sparse() { return [...this]; } static from(obj, ncols) { if (obj instanceof Matrix) { return obj; } else if (ncols != null) { const entries = obj; const nrows = Math.ceil(entries.length / ncols); return new Matrix(nrows, ncols, (row, col) => entries[row * ncols + col]); } else { const arrays = obj; const nrows = obj.length; const ncols = min(arrays.map((row) => row.length)); return new Matrix(nrows, ncols, (row, col) => arrays[row][col]); } } } //# sourceMappingURL=matrix.js.map