JSFiddle - React, Tailwind, and code Playground
JavaScript
/** Calculate and return the euclidean distance between two points. */
function hypot(xi, yi, xf, yf) {
return Math.sqrt(Math.pow(xi - xf, 2) + Math.pow(yi - yf, 2));
}
/** Generates an identity matrix of size (dim x dim). */
function eye(dim) {
var mat = new Array(dim * dim);
for (var i = 0; i < dim; i++) {
for (var j = 0; j < dim; j++) {
mat[i * dim + j] = (j == i) ? 1.0 : 0.0;
}
}
return mat;
}
/** Generates a Gaussian Blur kernel for matrix processing.
@param dim Length of one side of the kernel (Must be odd).
@param sigma Standard deviation of the gaussian function.
@returns A 1D array holding the resulting (dim x dim) kernel.
*/
function buildKernel(dim, sigma) {
var kernel = [];
var center = (dim - 1) / 2;
for (var i = 0; i < dim; i++) {
for (var j = 0; j < dim; j++) {
var dist = hypot(i, j, center, center);
var a = (1 / Math.sqrt(Math.PI * 2 * sigma * sigma));
var samp = a * Math.exp(-1 * (Math.pow(dist, 2) / (2 * sigma * sigma)));
kernel.push(samp);
}
}
return normalize(kernel);
}
/** Returns a normalized array such that the sum of all elements is 1.0 */
function normalize(arr) {
let sum = 0.0;
for (let i = 0; i < arr.length; i++) {
sum += arr[i];
}
for (let i = 0; i < arr.length; i++) {
arr[i] = arr[i] / sum;
}
return arr;
}
/** Mutates and returns an array with normalized column sums. */
function markovNormalize(arr) {
let dim = +Math.sqrt(arr);
for (let j = 0; j < dim; j++) {
let sum = 0.0;
for (let i = 0; i < dim; i++) {
sum += arr[i * dim + j];
}
for (let i = 0; i < dim; i++) {
arr[i * dim + j] = arr[i * dim + j] / sum;
}
}
return arr;
}
function scalarMultiply(arr, s) {
for (let i = 0; i < arr.length; i++) {
arr[i] = Math.floor(arr[i] * s);
}
return arr;
}
/** Convolves a matrix with a given kernel. */
function convolve(mat, kernel) {
var matDim =...