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))