JSFiddle - React, Tailwind, and code Playground
by evgkch
JavaScript
const { log2 } = Math;
const mul = (A, colsA, rowsA) => (B, colsB, rowsB) => {
if (colsA !== rowsB)
throw new Error('Number of cols A and rows B are different.')
const C = new Array(rowsA * colsB);
const logH = log2(rowsA);
const logW = log2(colsB);
const frame = log2(colsA);
const depth = logW + logH;
const mask = (1 << logH) - 1;
function calc(d, sa, sb, j) {
if (d > 0)
{
return calc(d - 1, sa, sb, j << 1) + calc(d - 1, sa, sb, (j << 1) ^ 1);
}
else
{
return A[(sa * colsA) ^ j] * B[sb ^ (colsB * j)]
}
}
function helper(d, i) {
if (d > 0)
{
helper(d - 1, i << 1);
helper(d - 1, (i << 1) ^ 1);
}
else
{
C[i] = calc(frame, i >> logH, i & mask)
}
}
helper(logH + logW);
return C;
};
const MultiplyMatrix = (A, colsA, rowsA) => (B, colsB, rowsB) => {
if (colsA !== rowsB)
throw new Error('Number of cols A and rows B are different.')
const C = new Array(rowsA * colsB);
for (let i = 0; i < rowsA; i++)
{
for (let j = 0; j < colsB; j++)
{
let sum = 0;
for (let k = 0; k < colsB; k++)
sum += A[i * colsA + k] * B[k * colsB + j];
C[i * colsB + j] = sum;
}
}
return C;
}
const arr = Array.from({ length: 1 << 20 }, (_, k) => Math.random());
const A = [0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12, 13, 14, 15];
const B = [0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12, 13, 14, 15];
console.log(Array.from(mul(A, 4, 4)(B, 4, 4)));
console.log(MultiplyMatrix(arr, 1 << 10, 1 << 10)(arr, 1 << 10, 1 << 10))