molstar
Version:
A comprehensive macromolecular library.
111 lines • 3.91 kB
JavaScript
/**
* Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.Matrix = void 0;
var Matrix;
(function (Matrix) {
function create(cols, rows, ctor) {
if (ctor === void 0) { ctor = Float32Array; }
var size = cols * rows;
return { data: new ctor(size), size: size, cols: cols, rows: rows };
}
Matrix.create = create;
/** Get element assuming data are stored in column-major order */
function get(m, i, j) {
return m.data[m.rows * j + i];
}
Matrix.get = get;
/** Set element assuming data are stored in column-major order */
function set(m, i, j, value) {
m.data[m.rows * j + i] = value;
return m;
}
Matrix.set = set;
/** Add to element assuming data are stored in column-major order */
function add(m, i, j, value) {
m.data[m.rows * j + i] += value;
return m;
}
Matrix.add = add;
/** Zero out the matrix */
function makeZero(m) {
m.data.fill(0.0);
return m;
}
Matrix.makeZero = makeZero;
function clone(m) {
return { data: m.data.slice(), size: m.size, cols: m.cols, rows: m.rows };
}
Matrix.clone = clone;
function fromArray(data, cols, rows) {
return { data: data, size: cols * rows, cols: cols, rows: rows };
}
Matrix.fromArray = fromArray;
function transpose(out, mat) {
if (out.cols !== mat.rows || out.rows !== mat.cols) {
throw new Error('transpose: matrix dimensions incompatible');
}
if (out.data === mat.data) {
throw new Error('transpose: matrices share memory');
}
var nrows = mat.rows, ncols = mat.cols;
var md = mat.data, mtd = out.data;
for (var i = 0, mi = 0, mti = 0; i < nrows; mti += 1, mi += ncols, ++i) {
var ri = mti;
for (var j = 0; j < ncols; ri += nrows, j++)
mtd[ri] = md[mi + j];
}
return out;
}
Matrix.transpose = transpose;
/** out = matA * matB' */
function multiplyABt(out, matA, matB) {
var ncols = matA.cols, nrows = matA.rows, mrows = matB.rows;
var ad = matA.data, bd = matB.data, cd = out.data;
for (var i = 0, matAp = 0, outP = 0; i < nrows; matAp += ncols, i++) {
for (var pB = 0, j = 0; j < mrows; outP++, j++) {
var sum = 0.0;
var pMatA = matAp;
for (var k = 0; k < ncols; pMatA++, pB++, k++) {
sum += ad[pMatA] * bd[pB];
}
cd[outP] = sum;
}
}
return out;
}
Matrix.multiplyABt = multiplyABt;
/** Get the mean of rows in `mat` */
function meanRows(mat) {
var nrows = mat.rows, ncols = mat.cols;
var md = mat.data;
var mean = new Array(ncols);
for (var j = 0; j < ncols; ++j)
mean[j] = 0.0;
for (var i = 0, p = 0; i < nrows; ++i) {
for (var j = 0; j < ncols; ++j, ++p)
mean[j] += md[p];
}
for (var j = 0; j < ncols; ++j)
mean[j] /= nrows;
return mean;
}
Matrix.meanRows = meanRows;
/** Subtract `row` from all rows in `mat` */
function subRows(mat, row) {
var nrows = mat.rows, ncols = mat.cols;
var md = mat.data;
for (var i = 0, p = 0; i < nrows; ++i) {
for (var j = 0; j < ncols; ++j, ++p)
md[p] -= row[j];
}
return mat;
}
Matrix.subRows = subRows;
})(Matrix || (Matrix = {}));
exports.Matrix = Matrix;
//# sourceMappingURL=matrix.js.map
;