// matrix (m*n), matrix(n*l), vl: vector length=n
// this matmul is row-wise multiplication. 'x' and result are row-vectors.
// ret^T = m * x^T
//
function matmul(m, x, vl) //vl is vector length
{
var ret=[];
var res_l = m.length/vl;
for (var vi =0; vi < x.length/vl; vi++){ //vector index
for (var r = 0; r<m.length/vl; r++){ //row of matrix
ret[vi*res_l+r] = 0;
for (var i = 0; i<vl; i++){
console.log(`${vi*res_l+r} => ${r * vl + i} - ${vi*vl+i} `)
ret[vi*res_l+r] += m[r*vl+i]*x[vi*vl+i];
}
}
}
return ret;
}
function matmul2(m, x, vl) //vl is vector length
{
var ret = [];
var rows = m.length / vl;
var cols = x.length / vl;
for (var r = 0; r < rows; r++) {
for (var c = 0; c < cols; c++) {
ret[r * cols + c] = 0;
for (var i = 0; i < vl; i++) {
console.log(`${r * cols + c} => ${r * vl + i} - ${i*cols+c}`)
ret[r * cols + c] += m[r * vl + i] * x[i * cols + c];
}
}
}
return ret;
}
function transpose(m, cl=NaN){
var rl = m.length/cl;
for (var i = 0; i<cl; i++){
for(var j=i+1; j<rl; j++){
console.log(`${i*rl + j} <=> ${j*cl+i}`)
var t = m[i*rl + j];
m[i*rl + j] = m[j*cl+i];
m[j*cl+i] = t;
}
}
return m;
}
const m1 = [1, 2, 3, 4, 5, 6]
const m2 = [7, 8, 9, 10, 11, 12]
const m3 = [0,1,2,3,4,5,6,7,8]
console.log(matmul2(m1, m2, 3))
console.log(matmul([1,2,3,4], [1,2,3,4], 2))
// transpose(m3,3)
console