我正在用 Javascript 编写数组的一个子类,以便更好地支持矩阵运算(我知道其他存在,这部分是为了让我重新自学线性代数),我想要的是有一些属性可以随时重置调整矩阵中的任何值。像行列式这样的一些计算是计算密集型的,我希望能够存储它们以避免重新计算,但是每当任何矩阵元素发生变化时,它们都需要重置为空。
从本质上讲,我想要的是已弃用的Array.observe()。而替换,代理,对于这件事来说似乎是很多开销。正如在使用未直接解决的代理对象检测 Javascript 数组中的更改的一些评论中所提到的,我不想只通过代理访问我的矩阵。我在迄今为止编写的代码中使用了很多方便的[i][j]
索引。[mat[i], mat[j]] = [mat[j], mat[i]]
class Matrix extends Array {
constructor() {
var args = [];
for (var i = 0; i < arguments.length; i++) {
if (Array.isArray(arguments[i])) {
args.push(new Matrix(...arguments[i]));
} else {
args.push(arguments[i]);
}
}
super(...args);
this._determinant = null;
}
determ(forceRecalculate = false) {
if (this._determinant === null || forceRecalculate) {
this.upperEchelon();
}
return this._determinant;
}
upperEchelon(reduced = false) {
//There's a lot of code here but in the process of doing this other thing
//you get 99% of the way to calculating the determinant so it does this
this._determinant = factor;
}
}
基本上,我想要任何类似mat[0][0] = 10
或mat.push([2,4,5])
更新矩阵中的值的东西来设置mat._determinant = null
。或任何等效的标记方法,需要在下次请求时重新计算。如果有人可以帮助我弄清楚实现,我并不反对使用代理,我只是希望这个 set-to-null-on-update 属性是我的类功能所固有的。
我真正想要的是一种重载基本方法(如[]
la C#)的方法,因此执行更新的函数会在不更改语法的情况下触发它,但我已经放弃了在 JS 中没有它。