Я пытался реализовать 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
* * +1018 Inv
0,8913610667753092 0,8898546572478708 0,25592546060133237
+0,26618513545092265 +0,26573527978742995 +0,07642644034471581 * * +0,06242659726 тысяча двадцать-одна1833985 0.06232109565941264 0.017923775508624545
Я был бы очень благодарен за любую помощь, так как не могу найти решение.Возможно, я где-то перепутал указатель или неправильно реализовал алгоритм.