Исключение Гаусса в Java

Я пытался реализовать 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.

Я следовал псевдокоду этой страницы википедии для реализации алгоритма.
Метод возвращает значение матрица со строкой первого опорного элемента сверху, но неправильно вычисляет нижние строки.

Например:

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

Буду очень благодарен за любую помощь, так как не могу найти решение. Я, вероятно, где-то перепутал указатель или неправильно реализовал алгоритм.


person anddromedar    schedule 03.03.2011    source источник
comment
Привет, можешь опубликовать исходник своего класса Matrix.   -  person michal.kreuzman    schedule 03.03.2011


Ответы (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];

Вы должны изменить = на -=. Алгоритм говорит: «вычесть A[u,j] * строку i из строки u». Вы просто заменяете значения в строке u продуктом.

person Dave Costa    schedule 03.03.2011
comment
Спасибо. Вы мне очень помогли. С этими доработками работает нормально. - person anddromedar; 03.03.2011