如何减去这两个数组
How to subtract these two arrays
我正在尝试减去两个矩阵,我有一个接受这些矩阵的函数和 returns 一个已被减去的新矩阵。
我在 node.js 中收到此错误:TypeError: (intermediate value).map is not a function
subtract(a, b) {
return new Matrix(a.rows, a.cols).map((_, i, j) => a.data[i][j] - b.data[i][j]);
}
这是我在主文件中使用的函数(注意:我已经有了 class 的实例)。
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:
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));
}
}
我将推荐一个完整的代码重写,重点放在普通函数而不是 classes 和方法上。我们在下面开始编写我们的 matrix
模块,并将在这个 post 的第二部分添加一个 OOP 风格的接口。 -
// 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 }
接下来我们编写使用matrix
模块的main
模块-
// main.js
import { matrix, subtract, toString } from "./matrix.js"
const m1 = matrix([[10, 11], [12, 13]])
const m2 = matrix([[1,2], [3,4]])
console.log(toString(m1))
console.log(toString(m2))
console.log(toString(subtract(m1, m2)))
[ 10 11
12 13 ]
[ 1 2
3 4 ]
[ 9 9
9 9 ]
如果您更喜欢 OOP 风格的界面,我们可以轻松地将其添加到我们的 matrix
模块中。请注意我们的 Matrix
class 它是如何简单地包装我们现有的普通函数 -
// 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.log(m1.toString())
console.log(m2.toString())
console.log(m1.subtract(m2).toString())
[ 10 11
12 13 ]
[ 1 2
3 4 ]
[ 9 9
9 9 ]
连锁几天,如果你愿意-
console.log(m1.subtract(m2).subtract(m2).toString())
console.log(m2.subtract(m1).subtract(m1).subtract(m1).toString())
[ 8 7
6 5 ]
[ -29 -31
-33 -35 ]
如您所见,我们只编写 matrix
模块 一次 并且它足够灵活,可以在函数式风格中使用 and OOP 风格。要查看在其他设置中使用的此模块技术,请参阅 this answer 我们构建链表的地方。
想知道为什么我们在 matrix.toString
遇到了这么多麻烦?这样即使元素大小不同,矩阵也可以很好地格式化 -
import { matrix, toString } from "./matrix.js"
const m3 = matrix([
[1,2,3],
[11,22,33]
[111,222,333]
])
console.log(toString(m3))
[ 1 2 3
11 22 33
111 222 333 ]
我正在尝试减去两个矩阵,我有一个接受这些矩阵的函数和 returns 一个已被减去的新矩阵。 我在 node.js 中收到此错误:TypeError: (intermediate value).map is not a function
subtract(a, b) {
return new Matrix(a.rows, a.cols).map((_, i, j) => a.data[i][j] - b.data[i][j]);
}
这是我在主文件中使用的函数(注意:我已经有了 class 的实例)。
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:
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));
}
}
我将推荐一个完整的代码重写,重点放在普通函数而不是 classes 和方法上。我们在下面开始编写我们的 matrix
模块,并将在这个 post 的第二部分添加一个 OOP 风格的接口。 -
// 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 }
接下来我们编写使用matrix
模块的main
模块-
// main.js
import { matrix, subtract, toString } from "./matrix.js"
const m1 = matrix([[10, 11], [12, 13]])
const m2 = matrix([[1,2], [3,4]])
console.log(toString(m1))
console.log(toString(m2))
console.log(toString(subtract(m1, m2)))
[ 10 11
12 13 ]
[ 1 2
3 4 ]
[ 9 9
9 9 ]
如果您更喜欢 OOP 风格的界面,我们可以轻松地将其添加到我们的 matrix
模块中。请注意我们的 Matrix
class 它是如何简单地包装我们现有的普通函数 -
// 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.log(m1.toString())
console.log(m2.toString())
console.log(m1.subtract(m2).toString())
[ 10 11
12 13 ]
[ 1 2
3 4 ]
[ 9 9
9 9 ]
连锁几天,如果你愿意-
console.log(m1.subtract(m2).subtract(m2).toString())
console.log(m2.subtract(m1).subtract(m1).subtract(m1).toString())
[ 8 7
6 5 ]
[ -29 -31
-33 -35 ]
如您所见,我们只编写 matrix
模块 一次 并且它足够灵活,可以在函数式风格中使用 and OOP 风格。要查看在其他设置中使用的此模块技术,请参阅 this answer 我们构建链表的地方。
想知道为什么我们在 matrix.toString
遇到了这么多麻烦?这样即使元素大小不同,矩阵也可以很好地格式化 -
import { matrix, toString } from "./matrix.js"
const m3 = matrix([
[1,2,3],
[11,22,33]
[111,222,333]
])
console.log(toString(m3))
[ 1 2 3
11 22 33
111 222 333 ]