SOURCE

// 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 命令行工具 X clear

                    
>
console