我尝试制作一个JavaScript函数来显示使用高斯方法求解线性方程组的步骤。到目前为止,我得到的结果(仅占高斯消去方法的一小部分,构造了前导零):
let mt = [[2, 3, -1, 5], [4, 0, -3, 3], [-2, 3, -1, 1]];
gaussMethod(mt);
function gaussMethod(mtx) {
window.GaussMatrixSteps = [];
window.GaussMatrixSteps[0] = mtx;
let n = mtx.length;
for (i = 0; i < n; i++) {
for (k = i + 1; k < n; k++) {
var multiplier = mtx[k][i] / mtx[i][i];
for (j = 0; j <= n; j++) {
mtx[k][j] = mtx[k][j] - mtx[i][j] * multiplier;
}
}
window.GaussMatrixSteps[i + 1] = mtx;
}
}
我得到的结果是,window.GaussMatrixSteps
是相同矩阵的数组(最后一步),而不是来自不同步骤的不同矩阵。真的是JavaScript的工作方式吗?
答案 0 :(得分:1)
您的问题是,您正在将一个数组设置为另一个数组的第一个元素。
let mt = [[2, 3, -1, 5], [4, 0, -3, 3], [-2, 3, -1, 1]];
gaussMethod(mt);
function gaussMethod(mtx) {
window.GaussMatrixSteps = [];
window.GaussMatrixSteps[0] = mtx; // issue is here
let n = mtx.length;
您正在创建这个
[0] = [[2, 3, -1, 5], [4, 0, -3, 3], [-2, 3, -1, 1]]
[1] = null
您需要做的是删除对第一个数组的引用,或者只是重复使用该数组。
您还需要养成使用let
或const
声明所有变量的习惯,并避免使用window
对象作为变量占位符。因此,您可以在函数内使用私有变量,并按如下所示返回它:
const GaussMatrixSteps = gaussMethod(mt);
function gaussMethod(mtx) {
const GaussMatrixSteps = [];
GaussMatrixSteps[0] = mtx;
... CODE HERE
return GaussMatrixSteps;
}
此外,不要忘了像这样声明内部for循环变量:
for (let i = 0; i < n; i++) {
for (let k = i + 1; k < n; k++) {
for (let j = 0; j <= n; j++) {
}
}
}