Как вычесть эти два массива

Я пытаюсь вычесть две матрицы, у меня есть функция, которая принимает эти матрицы и возвращает новую матрицу, которая была вычтена. Я получаю эту ошибку в node.js: TypeError: (промежуточное значение).map не является функцией

subtract(a, b) {

  return new Matrix(a.rows, a.cols).map((_, i, j) => a.data[i][j] - b.data[i][j]);
}

Это функция, которую я использую из своего основного файла (примечание: у меня уже есть экземпляр класса).

let m = new Matrix(2, 2);
m.data[0] = [10, 11];
m.data[1] = [12, 13];

let n = new Matrix(2, 2);
n.data[0] = [1, 2];
n.data[1] = [3, 4];

mat.subtract(m, n);

Это класс, который я создал:

class Matrix {
    constructor(rows, cols) {
      this.rows = rows;
      this.cols = cols;
      this.index = 0;
      this.rowCount = 0;
  
      //this.matrixData = Array(this.rows).fill().map(() => Array(this.cols).fill(0));
      this.data = Array(this.rows).fill().map(() => Array(this.cols).fill(0));
    }
}
.map((_, i, j) => ...) делает не то, что вы думаете. i — это индекс элемента, но j — это ссылка на отображаемый массив, а не индекс второго измерения.
Mulan 16.12.2020 22:10

создание нового экземпляра Matrix и последующее изменение внутреннего .data — это плохо, плохое злоупотребление инкапсуляцией данных членов. Обратите внимание, что на .rowCount не влияет установка .data вручную. Это непонимание того, как правильно использовать классы.

Mulan 16.12.2020 22:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
254
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я собираюсь порекомендовать полностью переписать код, который фокусируется на простых функциях, а не на классах и методах. Мы начинаем писать наш модуль matrix ниже и добавим интерфейс в стиле ООП во втором разделе этого поста. -

// matrix.js

const matrix = rows =>
  ({ matrix, rows })

const empty = _ =>
  matrix([])

const subtract = (t1, t2) =>
  matrix(t1.rows.map((_, i) => subtractRow(t1.rows[i], t2.rows[i])))

const subtractRow = (r1, r2) =>
  r1.map((v, i) => v - r2[i])

function toString (t)
{ const w =
    Math.max(...t.rows.flat().map(_ => String(_).length))
  const s = 
    t.rows.map(r => r.map(_ => String(_).padStart(w, " ")).join(" "))
  return `[ ${s.join("\n  ")} ]`
}

export { empty, matrix, subtract, toString } 

Затем мы пишем наш модуль main, который использует модуль matrix

// main.js

import { matrix, subtract, toString } from "./matrix.js"

const m1 = matrix([[10, 11], [12, 13]])
const m2 = matrix([[1,2], [3,4]])

console.info(toString(m1))
console.info(toString(m2))
console.info(toString(subtract(m1, m2)))
[ 10 11
  12 13 ]

[ 1 2
  3 4 ]

[ 9 9
  9 9 ]

Если вам больше нравится интерфейс в стиле ООП, мы можем легко добавить его в наш модуль matrix. Обратите внимание, что наш класс Matrix представляет собой простую оболочку наших существующих простых функций:

// matrix.js (continued)

class Matrix
{ constructor(t = empty())
  { this.t = t }

  subtract(other)
  { return new Matrix(subtract(this.t, other.t)) }

  toString()
  { return toString(this.t) }

  static of(rows)
  { return new Matrix(matrix(rows)) }
}

export default Matrix

А вот и наш main модуль, использующий наш новый Matrix интерфейс -

// main.js

import Matrix from "./matrix.js"

const m1 = Matrix.of([[10, 11], [12, 13]])
const m2 = Matrix.of([[1,2], [3,4]])

console.info(m1.toString())
console.info(m2.toString())
console.info(m1.subtract(m2).toString())
[ 10 11
  12 13 ]

[ 1 2
  3 4 ]

[ 9 9
  9 9 ]

Цепь на дни, если хочешь -

console.info(m1.subtract(m2).subtract(m2).toString())
console.info(m2.subtract(m1).subtract(m1).subtract(m1).toString())
[ 8 7
  6 5 ]

[ -29 -31
  -33 -35 ]

Как видите, мы пишем наш модуль matrix только один раз, и он достаточно гибкий для использования в функциональном стиле и стиле ООП. Чтобы увидеть, как этот модульный метод используется в другом параметре, см. этот ответ, где мы строим связанный список.


Хотите знать, почему мы прошли через столько проблем в matrix.toString? Это сделано для того, чтобы матрица могла быть красиво отформатирована, даже если размеры элементов различаются -

import { matrix, toString } from "./matrix.js"

const m3 = matrix([
  [1,2,3],
  [11,22,33]
  [111,222,333]
])

console.info(toString(m3))
[   1   2   3
   11  22  33
  111 222 333 ]

Другие вопросы по теме