在Javascript中乘以2个矩阵

Jor*_*454 11 javascript arrays matrix matrix-multiplication

我正在做一个乘以2个矩阵的函数.矩阵将始终具有相同的行数和列数.(2x2,5x5,23x23,......)

当我打印它时,它不起作用.为什么?

例如,如果我创建两个2x2矩阵:

矩阵matrixA:

[1][2]

[3][4]
Run Code Online (Sandbox Code Playgroud)

matrixB:

[5][6]

[7][8]
Run Code Online (Sandbox Code Playgroud)

结果应该是:

[19][22]

[43][50]
Run Code Online (Sandbox Code Playgroud)

(http://ncalculators.com/matrix/2x2-matrix-multiplication-calculator.htm)

但是,我得到:

[19][undefined]

[22][indefined]
Run Code Online (Sandbox Code Playgroud)

function multiplyMatrix(matrixA, matrixB)
{
    var result = new Array();//declare an array   

    //var numColsRows=$("#matrixRC").val();
    numColsRows=2;
    
    //iterating through first matrix rows
    for (var i = 0; i < numColsRows; i++) 
    {
        //iterating through second matrix columns
        for (var j = 0; j < numColsRows; j++) 
        { 
            var matrixRow = new Array();//declare an array
            var rrr = new Array();
            var resu = new Array();
            //calculating sum of pairwise products
            for (var k = 0; k < numColsRows; k++) 
            {
                rrr.push(parseInt(matrixA[i][k])*parseInt(matrixB[k][j]));
            }//for 3
            resu.push(parseInt(rrr[i])+parseInt(rrr[i+1]));

            result.push(resu);
            //result.push(matrixRow);
        }//for 2
    }//for 1
    return result;
}// function multiplyMatrix
Run Code Online (Sandbox Code Playgroud)

Mic*_*zlo 16

你对各种临时数组感到困惑.这些undefined值是由最内层循环下面的行上的越界访问引起的.

我建议您坚持为乘法结果制作单个数组.您可能已经意识到,遗憾的是JavaScript不允许您初始化多维数组.要制作二维数组,必须初始化一维数组,然后迭代其元素并将每个数组初始化为一维数组.

function multiply(a, b) {
  var aNumRows = a.length, aNumCols = a[0].length,
      bNumRows = b.length, bNumCols = b[0].length,
      m = new Array(aNumRows);  // initialize array of rows
  for (var r = 0; r < aNumRows; ++r) {
    m[r] = new Array(bNumCols); // initialize the current row
    for (var c = 0; c < bNumCols; ++c) {
      m[r][c] = 0;             // initialize the current cell
      for (var i = 0; i < aNumCols; ++i) {
        m[r][c] += a[r][i] * b[i][c];
      }
    }
  }
  return m;
}

function display(m) {
  for (var r = 0; r < m.length; ++r) {
    document.write('&nbsp;&nbsp;'+m[r].join(' ')+'<br />');
  }
}

var a = [[8, 3], [2, 4], [3, 6]],
    b = [[1, 2, 3], [4, 6, 8]];
document.write('matrix a:<br />');
display(a);
document.write('matrix b:<br />');
display(b);
document.write('a * b =<br />');
display(multiply(a, b));
Run Code Online (Sandbox Code Playgroud)


Joh*_*ria 9

你可以使用multiplyMatrices()函数:http://tech.pro/tutorial/1527/matrix-multiplication-in-functional-javascript它就像魅力一样.示例(您可以使用console.table()在Chrome和Firefox控制台中打印带样式的矩阵):

function multiplyMatrices(m1, m2) {
    var result = [];
    for (var i = 0; i < m1.length; i++) {
        result[i] = [];
        for (var j = 0; j < m2[0].length; j++) {
            var sum = 0;
            for (var k = 0; k < m1[0].length; k++) {
                sum += m1[i][k] * m2[k][j];
            }
            result[i][j] = sum;
        }
    }
    return result;
}

var m1 = [[1,2],[3,4]]
var m2 = [[5,6],[7,8]]

var mResult = multiplyMatrices(m1, m2)

/*In Google Chrome and Firefox you can do:*/

console.table(mResult) /* it shows the matrix in a table */
Run Code Online (Sandbox Code Playgroud)

console.table()中的结果矩阵


Fer*_*jal 8

我知道这是一个老问题,但我建议切换到我的答案.

我的解决方案具有良好的性能,因为它使用了Map Reduce 函数

//The chosen one
function matrixDot (A, B) {
    var result = new Array(A.length).fill(0).map(row => new Array(B[0].length).fill(0));

    return result.map((row, i) => {
        return row.map((val, j) => {
            return A[i].reduce((sum, elm, k) => sum + (elm*B[k][j]) ,0)
        })
    })
}

var print = m => m.forEach(r => document.write(`&nbsp;&nbsp;${r.join(' ')}<br/>`)) 

var a = [[8, 3], [2, 4], [3, 6]]
var b = [[1, 2, 3], [4, 6, 8]]

document.write('matrix a:<br />');
print(a);
document.write('matrix b:<br />');
print(b);
document.write('a * b =<br />');
print(matrixDot(a,b));
Run Code Online (Sandbox Code Playgroud)


Jan*_*roň 5

对于那些对纯函数式解决方案感兴趣的人:

let MatrixProd = (A, B) =>
  A.map((row, i) =>
    B[0].map((_, j) =>
      row.reduce((acc, _, n) =>
        acc + A[i][n] * B[n][j], 0
      )
    )
  )
Run Code Online (Sandbox Code Playgroud)

浏览器测试代码:

let A = [[8, 3], [2, 4], [3, 6]];
let B = [[1, 2, 3], [4, 6, 8]];
console.table(MatrixProd(A,B));
Run Code Online (Sandbox Code Playgroud)