NaN是否超出矩阵乘法?

时间:2018-11-30 07:44:23

标签: javascript algorithm debugging nan matrix-multiplication

我有下面的代码用于从数组中形成矩阵及其乘积。

但是,当我尝试将mtp(matrix(2,2,[1,2,3,4]),matrix(2,2,[1,0,0,1]))之类的两个矩阵相乘时,它会在所有位置返回NaN
请帮帮我

function matrix(m, n, arr) {
  var result = {};
  for (t = 1; t <= m; t++) {
    result[t] = {};
  };
  for (i = 1; i <= m; i++)
    for (j = 1; j <= n; j++) result[i][j] = arr[m * (i - 1) + j - 1];
  return {
    "result": result,
    "m": m,
    "n": n
  };
}

function mtp(a, b) {
  if (parseInt(a.n) != parseInt(b.m)) {
    return;
  } else {
    var result = [];
    var m = parseInt(a.m);
    var n = parseInt(b.n);
    var k = parseInt(a.n);
    for (i = 1; i <= m; i++) {
      for (j = 1; j <= n; j++) {
        for (p = 1; p <= k; p++) {
          result[m * (i - 1) + j - 1] += (parseInt(a.result[i][p]) * parseInt(b.result[p][j]));
          console.log(parseInt(a.result[i][p]) * parseInt(b.result[p][j]))
        }
      }
    }
  }
  console.log(result, matrix(m, n, result).result);
}

mtp(matrix(2,2,[1,2,3,4]),matrix(2,2,[1,0,0,1]));

1 个答案:

答案 0 :(得分:3)

定义result时,它是一个零元素数组

var result = [];

当您尝试将数字添加到数组的元素时,该元素未定义,将任何数字添加到未定义将得到NaN。有两种方法可以解决此问题,或者使用正确的零长度初始化数组,或者在求和期间将其默认为零。我在下面选择了后者,

result[m * (i - 1) + j - 1] = (result[m * (i - 1) + j - 1]||0) + (a.result[i][p] * b.result[p][j]);
// Note here ---------------------------------------------^

我摆脱了所有不必要的parseInt通话。

function matrix(m, n, arr) {
  var result = {};
  for (t = 1; t <= m; t++) {
    result[t] = {};
  };
  for (i = 1; i <= m; i++)
    for (j = 1; j <= n; j++) result[i][j] = arr[m * (i - 1) + j - 1];
  return {
    "result": result,
    "m": m,
    "n": n
  };
}

function mtp(a, b) {
  if (a.n != b.m) {
    return;
  } else {
    var result = [];
    var m = a.m;
    var n = b.n;
    var k = a.n;
    for (i = 1; i <= m; i++) {
      for (j = 1; j <= n; j++) {
        for (p = 1; p <= k; p++) {
          result[m * (i - 1) + j - 1] = (result[m * (i - 1) + j - 1]||0) + (a.result[i][p] * b.result[p][j]);
          console.log(a.result[i][p] * b.result[p][j])       
        }
      }
    }
  }
  console.log(result, matrix(m, n, result).result);
}

mtp(matrix(2,2,[1,2,3,4]),matrix(2,2,[1,0,0,1]));