2013-02-13 152 views
3

我在JavaScript中遇到了矩阵乘法代码问题。如果我运行下面有以下两个矩阵的功能:JS矩阵乘法问题

var m1 = [ [ 1, 0, 0 ], 
    [ 0, 1, 0 ], 
    [ 1, 1, 0 ], 
    [ 0, 0, 1 ], 
    [ 1, 0, 1 ], 
    [ 0, 1, 1 ], 
    [ 1, 1, 1 ] ]; 

var m2 = [ [ '0', '1', '1', '0', '0', '1', '1' ] ]; 

var matrixMult = function (m1, m2) { 
    console.log(m1); 
    console.log(m2); 
    console.log("m1 length: %d, m2[0].length: %d", m1.length, m2[0].length); 
    if (m1.length != m2[0].length) { 
      console.error("Incompatible matrix dimensions for multiplication."); 
      return false; 
    } 

    var result = []; 

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

我得到这个错误:

/path/to/file.js:58 
       sum += m1[i][k] * m2[k][j]; 
            ^
TypeError: Cannot read property '0' of undefined 
    at matrixMult (...) 

什么错?问题是m2.length只有1吗?

回答

7

世上只有m2[0],但你的内心for循环运行从0m1.length,比0更大。所以当它试图访问m2[1]它会引发错误。

另外,通过矩阵乘法的定义如下

Multiplication of two matrices is defined only if the number of columns of the left matrix is the same as the number of rows of the right matrix.

(来源:Wikipedia

你不能乘你的样品基质,因为m1有3列,但m2仅有一行。

编辑

现在,我明白你的问题正确,我写了一个小功能,可以帮助您解决:

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

multiplyMatrix(m1, m2); 

// => [ [2, 4, 2] ] 
+0

任何修复建议? – warchinal 2013-02-13 10:28:24

+0

就像我说的,先修复你的矩阵。你不能将这两个数字相乘。 – Amberlamps 2013-02-13 10:30:05

+0

m1有7列(每个内部数组表示一列),m2有7行但是1列,所以它是(3,7)*(7,1) – warchinal 2013-02-13 10:36:35