6

Javaを学ぶためにMatrix.classを実装しようとしていました。現在、後で行列の逆数を見つけるために使用されるガウス消去法後に行列を返すメソッドに問題があります。
これが私がこれまでに思いついたものです:

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 を返します。

このウィキペディアのページの疑似コードに従って、アルゴリズムを実装しました。
このメソッドは、最初のピボット要素の行が一番上にあるマトリックスを返しますが、下の行を正しく計算しません。

例えば:

0.2635522849474877
0.10001114673002853
0.442971040143471
0.2986277338922876 0.75176425779959294 0.0915019033383838383838383838383838207210072100721007210072100721007210072100721007210072100721007210072100721007210072100721007210072100721007210072100721

Inv
0.8913610667753092 0.8898546572478708 0.25592546060133237
0.26618513545092265 0.26573527978742995 0.07642644034471581
0.062426597261833985 0.06232109565941264 0.017923775508624545

解決策が見つからないので、何か助けていただければ幸いです。おそらくどこかでポインタを混ぜたか、アルゴリズムを間違って実装したのでしょう。

4

1 に答える 1

4

2 つの問題があります。

これらの行で:

        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 の値を積に置き換えるだけです。

于 2011-03-03T13:49:03.010 に答える