Java中的高斯消元法

6

我正在尝试实现一个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页面的伪代码实现了该算法。方法返回具有第一个主元素行在顶部的矩阵,但不能正确计算较低的行。
例如:
A
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

我非常感谢您的帮助,因为我找不到解决方案。我可能在某个地方混淆了指针或者实现算法有误。


你好,能否提供你的Matrix类的源代码? - michal.kreuzman
1个回答

4

I see two problems.

In these lines:

        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中的值。

1
谢谢。你帮了我很多。有了这些修改,它运行得很好。 - anddromedar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接