NaN вне матрицы умножения? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть код ниже для формирования матрицы из массива и ее умножения.

Но когда я пытаюсь умножить две матрицы, такие как 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]));

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Когда вы определяете result, это массив нулевых элементов

var result = [];

Когда вы пытаетесь добавить число к элементу массива, этот элемент не определяется, Добавление любого числа к неопределенномудает вам NaN.Есть 2 способа решить эту проблему: либо инициализировать массив с правильной длиной нулей, либо по умолчанию установить его в ноль во время суммирования.Я выбрал последнее ниже:

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]));
0 голосов
/ 30 ноября 2018

В вашей функции mtp() значения элементов внутри вашего результирующего массива неинициализированы (то есть вы определили массив, но у этого массива нет фактических значений или даже определенной длины), поэтому в вашем внутреннем циклекогда вы +=, вы ссылаетесь на вновь созданный элемент массива, который не имеет значения по умолчанию (и, следовательно, undefined), и добавляете некоторое число к этому неопределенному значению.

Неопределенное значение плюс числоэто не число (NaN).Попробуйте предварительно инициализировать ваш массив результатов.

...