【问题标题】:Gaussian Elimination in JavaJava中的高斯消除
【发布时间】:2011-03-03 12:11:17
【问题描述】:

我试图实现一个 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

投资
0.8913610667753092 0.8898546572478708 0.25592546060133237
0.26618513545092265 0.26573527978742995 0.07642644034471581
0.062426597261833985 0.06232109565941264 0.017923775508624545

我将非常感谢任何帮助,因为我找不到解决方案。我可能在某处混合了一个指针或执行了错误的算法。

【问题讨论】:

  • 您好,您可以发布您的Matrix 课程的来源吗?

标签: java algorithm matrix gaussian


【解决方案1】:

我发现了两个问题。

在这些行中:

        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 行中的值替换为产品。

【讨论】:

  • 谢谢。你帮了我很多。通过这些修改,它可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多