我在JavaScript中遇到矩阵乘法代码有问题。如果我使用以下两个矩阵运行下面的函数:
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?
答案 0 :(得分:7)
只有m2[0]
,但您的内部for
循环从0
到m1.length
,大于0
。因此,当它尝试访问m2[1]
时会抛出错误。
还通过以下矩阵乘法的定义
只有当左矩阵的列数与右矩阵的行数相同时,才定义两个矩阵的乘法。
(资料来源: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] ]