我试图实现一个Matrix.class来学习一些Java。
现在,我对一个方法有些困难,该方法应该在高斯消除后返回矩阵,这将用于稍后查找矩阵的逆矩阵。
这是我到目前为止所提出的:
public Matrix gaussianElimination() {
Matrix inv = this.clone();
int i = 0;
int j = 0;
while (i<inv.getHeight() && j<inv.getWidth()) {
int pivot = i;
for (int k=i+1; k<inv.getHeight(); k++) {
if (Math.abs(inv.getArray()[k][j]) > Math.abs(inv.getArray()[pivot][j])) {
pivot = k;
}
}
if (inv.getArray()[pivot][j] != 0) {
inv = inv.swapRow(i, pivot);
double div = inv.getArray()[i][j];
for (double value : inv.getArray()[i]) {
value = value/div;
}
for (int u=i+1; u < inv.getHeight(); u++) {
double mult = inv.getArray()[u][j];
for (int l=0; l<inv.getWidth(); l++) {
inv.getArray()[u][l] = mult * inv.getArray()[i][l];
}
}
}
j++;
i++;
}
return inv;
}
而getArray()函数返回矩阵的double [] [],而getHeight()和getWidth()则相应地返回inv.length和inv [0] .length。
我按照这个wikipedia页面的伪代码来实现算法 该方法返回一个矩阵,其中第一个枢轴元素的行位于顶部,但不能正确计算下面的行。
例如:
一个
0.2635522849474877 0.10001114673002853 0.442971040143471
0.2986277338922876 0.7517642579959294 0.09150190333830721
0.8913610667753092 0.8898546572478708 0.25592546060133237
INV
0.8913610667753092 0.8898546572478708 0.25592546060133237
0.26618513545092265 0.26573527978742995 0.07642644034471581
0.062426597261833985 0.06232109565941264 0.017923775508624545
我会非常感谢任何帮助,因为我找不到解决方案。我可能在某个地方混合了一个指针或实现了错误的算法。
答案 0 :(得分:4)
我看到两个问题。
在这些方面:
for (double value : inv.getArray()[i]) {
value = value/div;
}
您没有修改存储在矩阵中的值;你只需修改value
的值然后丢弃它。你想要这样的东西:
for (int idx=0; idx<inv.getWidth(); idx++) {
inv.getArray()[i,idx] = inv.getArray()[i,idx] / div;
}
另外,在这一行:
inv.getArray()[u][l] = mult * inv.getArray()[i][l];
您应该将=
更改为-=
。算法说“从行u中减去A [u,j] *行i”。您只是将第u行中的值替换为产品。