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 =...