UNPKG

layout-base

Version:

Basic layout model and some utilities for Cytoscape.js layout extensions

165 lines (138 loc) 3.16 kB
// Some matrix (1d and 2d array) operations function Matrix() { } /** * matrix multiplication * array1, array2 and result are 2d arrays */ Matrix.multMat = function(array1, array2){ let result = []; for(let i = 0; i < array1.length; i++){ result[i] = []; for(let j = 0; j < array2[0].length; j++){ result[i][j] = 0; for(let k = 0; k < array1[0].length; k++){ result[i][j] += array1[i][k] * array2[k][j]; } } } return result; }; /** * matrix transpose * array and result are 2d arrays */ Matrix.transpose = function(array){ let result = []; for(let i = 0; i < array[0].length; i++){ result[i] = []; for(let j = 0; j < array.length; j++){ result[i][j] = array[j][i]; } } return result; }; /** * multiply array with constant * array and result are 1d arrays */ Matrix.multCons = function(array, constant){ let result = []; for(let i = 0; i < array.length; i++){ result[i] = array[i] * constant; } return result; }; /** * substract two arrays * array1, array2 and result are 1d arrays */ Matrix.minusOp = function(array1, array2){ let result = []; for(let i = 0; i < array1.length; i++){ result[i] = array1[i] - array2[i]; } return result; }; /** * dot product of two arrays with same size * array1 and array2 are 1d arrays */ Matrix.dotProduct = function(array1, array2){ let product = 0; for(let i = 0; i < array1.length; i++){ product += array1[i] * array2[i]; } return product; }; /** * magnitude of an array * array is 1d array */ Matrix.mag = function(array){ return Math.sqrt(this.dotProduct(array, array)); }; /** * normalization of an array * array and result are 1d array */ Matrix.normalize = function(array){ let result = []; let magnitude = this.mag(array); for(let i = 0; i < array.length; i++){ result[i] = array[i] / magnitude; } return result; }; /** * multiply an array with centering matrix * array and result are 1d array */ Matrix.multGamma = function(array){ let result = []; let sum = 0; for(let i = 0; i < array.length; i++){ sum += array[i]; } sum *= (-1)/array.length; for(let i = 0; i < array.length; i++){ result[i] = sum + array[i]; } return result; }; /** * a special matrix multiplication * result = 0.5 * C * INV * C^T * array * array and result are 1d, C and INV are 2d arrays */ Matrix.multL = function(array, C, INV){ let result = []; let temp1 = []; let temp2 = []; // multiply by C^T for(let i = 0; i < C[0].length; i++){ let sum = 0; for(let j = 0; j < C.length; j++){ sum += -0.5 * C[j][i] * array[j]; } temp1[i] = sum; } // multiply the result by INV for(let i = 0; i < INV.length; i++){ let sum = 0; for(let j = 0; j < INV.length; j++){ sum += INV[i][j] * temp1[j]; } temp2[i] = sum; } // multiply the result by C for(let i = 0; i < C.length; i++){ let sum = 0; for(let j = 0; j < C[0].length; j++){ sum += C[i][j] * temp2[j]; } result[i] = sum; } return result; }; module.exports = Matrix;