Search code examples
javascriptalgorithmdebuggingnanmatrix-multiplication

NaN out of matrix multiplication?


I have the code below for matrix formation out of an array and its multiplication.

But when I try to multiply two matrices like mtp(matrix(2,2,[1,2,3,4]),matrix(2,2,[1,0,0,1])) it returns NaN in all places.
Please help me out

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]));


Solution

  • When you define result it is an array of zero elements

    var result = [];
    

    When you try to add a number to an element of the array, that element is not defined, Adding any number to undefined gives you NaN. There are 2 ways to solve this, either initialize your array with the right length of zeros, or default it to zero during the sum. I've chosen the latter below,

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

    I've got rid of all the unnecessary parseInt calls.

    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]));