MATRIX

by evgkch

JavaScript

const createArray = (length) => Array.from( {length: length}, (v, k) => k );
const shuffle = (array) => array.sort( (a, b) => Math.random() - 0.5 );

const A = new Float32Array(shuffle(createArray(10000)))
const B = new Float32Array(shuffle(createArray(10000)))

class Matrix {
	static xy2Key(size) {
  	return ([ x , y ]) => x + size * y;
  }
  static keyToXY(size) {
  	return (key) =>
			new Int16Array(
  			[Math.floor(key % size) , Math.floor(key / size)]
  		);
  }
	static SUM(A, B) {
  	return new Float32Array(A.map((a, index) => a + B[index]));
  }
  static MULTIPLY(A, B) {
  	let size = Math.sqrt(A.length),
  			buffer = new ArrayBuffer(A.length * 4);
  	return new Float32Array(buffer).map((c, m) => {
    	let i = this.keyToXY(size)(m)[1],
      		j = this.keyToXY(size)(m)[0];
     	return Array.from({ length: size }, (v, k) => {
     		let keyA = this.xy2Key(size)([k, j]),
        		keyB = this.xy2Key(size)([i, k]);
      	return A[keyA] * B[keyB];
     	}).reduce((a, b) => a + b)
    });
  }
  static TEST(A, B) {
  	let size = Math.sqrt(A.length),
  	return A.map((c, m) => {
    	let i = this.keyToXY(size)(m)[1],
      		j = this.keyToXY(size)(m)[0];
     	return Array.from({ length: size }, (v, k) => {
     		let keyA = this.xy2Key(size)([k, j]),
        		keyB = this.xy2Key(size)([i, k]);
      	return A[keyA] * B[keyB];
     	}).reduce((a, b) => a + b)
    });
  }
}

const test = (fn) => {
	let start = new Date().getTime();
  let finish = new Date().getTime();
  return console.log(`Lead time: ${Math.round(finish - start)} msec`)
}
test(Matrix.MULTIPLY(A, B))
test(Matrix.TEST(A, B))