提问人:merkkupilot 提问时间:10/30/2022 最后编辑:nimamerkkupilot 更新时间:11/1/2022 访问量:64
在 javascript 中将矩阵传递给静态方法时出错
Error when passing matrix to static method in javascript
问:
Uncaught (in promise) TypeError: Cannot set properties of undefined (setting '0')
嗨,在这个代码块中,由于这一行 ->,我得到了上面提到的错误result.data[j][i] = matrix.data[i][j].
我尝试调用一个静态转置方法,并向其传递一个已经创建的矩阵。出于某种原因,它会抛出一个错误,即给定的矩阵是未定义的,即使它不是,或者是吗?
static transpose(matrix) {
let result = new Matrix(this.cols, this.rows);
for (let i = 0; i < matrix.rows; i++) {
for (let j = 0; j < matrix.cols; j++) {
result.data[j][i] = matrix.data[i][j];
}
}
return result;
}
我正在关注丹尼尔·希夫曼 (daniel Shiffman) 的神经网络播放列表,我在下面链接的这一集中遇到了错误。
https://youtu.be/r2-P1Fi1g60?list=PLRqwX-V7Uu6aCibgK1PTWWu9by6XFdCfh
我已经坚持了这么久,所以提前谢谢你。
由于我是 js 的新手,我认为传递值或引用的工作方式可能与 Java 不同。因此,我尝试在方法中创建一个测试矩阵,但仍然抛出了未定义的相同问题。
static transpose(matrix) {
let test = new Matrix(2,2);
let result = new Matrix(this.cols, this.rows);
for (let i = 0; i < matrix.rows; i++) {
for (let j = 0; j < matrix.cols; j++) {
result.data[j][i] = test.data[i][j];
}
}
return result;
}
答:
引号中的原始答案
看起来该类将其数据存储在名为 的属性中,而不是 。下面是显示类定义位置的时间戳 https://youtu.be/puWqNBFDMMk?t=170
Matrix
matrix
data
Matrix
已更新以考虑重命名为:matrix
data
class Matrix {
constructor(rows, cols) {
this.rows = rows;
this.cols = cols;
this.data = [];
// ..(snip)..
}
}
更改为应该可以修复您看到的错误。
result.data
result.matrix
cannot set properties of undefined
但是,您将立即遇到另一个错误,即方法无法访问,因为它们是在类本身上调用的,而不是类的实例。您应该更改为 ,引用您作为参数传递的矩阵。下面是更新后的代码:static
this
this
matrix
static transpose(matrix) {
let result = new Matrix(matrix.cols, matrix.rows);
for (let i = 0; i < matrix.rows; i++) {
for (let j = 0; j < matrix.cols; j++) {
result.data[j][i] = matrix.data[i][j];
}
}
return result;
}
您将像这样调用该方法:
let m = new Matrix(2, 3);
Matrix.transpose(m);
确保您已重命名为 和 。他在第一次查找/替换的视频中错过了这一点,必须稍后返回并修复它,请参阅我评论中的时间戳。this.matrix
this.data
result.matrix
result.data
评论
我终于自己找到了问题!
它抛出错误的原因,实际上是非常糟糕的错误,所以很难找到。原因是,它是一个静态方法,在静态方法中,您无法访问矩阵属性,例如 this.rows 或 this.cols,因为它们中没有数据,因此抛出错误:无法设置未定义的属性。它必须是类的实例才能有数据。
let result = new Matrix(this.cols, this.rows);
上面提到的行在静态方法中不起作用,因为它正在尝试访问 Matrix 类属性,并且稍后会导致错误。
正确的方式如下。
static transpose(matrix) {
let result = new Matrix(matrix.cols, matrix.rows);
for (let i = 0; i < matrix.rows; i++) {
for (let j = 0; j < matrix.cols; j++) {
result.data[j][i] = matrix.data[i][j];
}
}
return result;
}
我仍然想向 js 社区询问的一件事是,为什么 js 在给出错误方面如此糟糕。我已经用 java 编写了很多代码,我知道它会在编码时立即显示错误 REAL-TIME 并节省大量时间。
评论