在 javascript 中将矩阵传递给静态方法时出错

Error when passing matrix to static method in javascript

提问人:merkkupilot 提问时间:10/30/2022 最后编辑:nimamerkkupilot 更新时间:11/1/2022 访问量:64

问:

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;
  }
JavaScript 数组参数 传递

评论


答:

0赞 superhawk610 10/30/2022 #1

引号中的原始答案

看起来该类将其数据存储在名为 的属性中,而不是 。下面是显示类定义位置的时间戳 https://youtu.be/puWqNBFDMMk?t=170MatrixmatrixdataMatrix

已更新以考虑重命名为:matrixdata

class Matrix {
  constructor(rows, cols) {
    this.rows = rows;
    this.cols = cols;
    this.data = [];

    // ..(snip)..
  }
}

更改为应该可以修复您看到的错误。result.dataresult.matrixcannot set properties of undefined

但是,您将立即遇到另一个错误,即方法无法访问,因为它们是在类本身上调用的,而不是类的实例。您应该更改为 ,引用您作为参数传递的矩阵。下面是更新后的代码:staticthisthismatrix

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.matrixthis.dataresult.matrixresult.data

评论

0赞 merkkupilot 10/31/2022
他更改了 matrix 类,使其具有以下视频中的 data 属性。youtube.com/....
0赞 superhawk610 10/31/2022
你是对的,我更新了我的答案。下面是方法更新位置的时间戳 youtu.be/HuZbYEn8AvY?t=610transpose
0赞 merkkupilot 11/1/2022
在我原来的帖子中,我展示了转置方法的代码,我已经将它们更改为 .data
0赞 merkkupilot 11/1/2022 #2

我终于自己找到了问题!

它抛出错误的原因,实际上是非常糟糕的错误,所以很难找到。原因是,它是一个静态方法,在静态方法中,您无法访问矩阵属性,例如 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 并节省大量时间。