Что делает блок кода, показанный ниже? Я не совсем понимаю
if (temp != j)
for (k = 0; k < 2 * dimension; k++) {
temporary = augmentedmatrix[j][k];
augmentedmatrix[j][k] = augmentedmatrix[temp][k];
augmentedmatrix[temp][k] = temporary;
}
Редактировать:
Первоначальный вопрос заключался в том, как вычислить обратную матрицу с помощью исключения Гаусса. ОП застрял на фактической части исключения алгоритма.
Теперь, если элемент 1,1 не равен нулю, вы переходите к нулевому элементу 2,1, используя элементарные операции матрицы:
F_s, t — чередуются строки s и t
F_s, t_ (a) — добавить строку t * a к s
F_s_ (a) — умножить строку s на
Вы также можете начать с обнуления 1,2 элемента.
Эти операции соответствуют элементарным матрицам (и матрицам линейного преобразования). Потому что каждая обратимая матрица может быть выражена как произведение некоторых элементарных матриц
A = P1,...,Pk,Ql,...,Q1
которые обратимы, мы можем получить обратное A, A_inverse
применяя соответствующие операции к исходной матрице A
и это то же самое, что умножение A
от P,Q
:
A_inverse = Q1_inv,...,Ql_inv,Pk_inv,...,P1_inv
Для каждой строки в матрице, если строка не состоит только из нулей,
тогда крайняя левая ненулевая запись называется ведущим коэффициентом
(или стержень) этого ряда. Так что, если два ведущих коэффициента находятся в одном и том же
столбца, то можно использовать операцию строки типа 3 (см. выше) для
сделать один из этих коэффициентов ноль. Затем с помощью перестановки строк
операция, всегда можно упорядочить строки так, чтобы для каждого ненулевого
ряд, ведущий коэффициент находится справа от ведущего
Коэффициент ряда выше. Если это так, то матрица называется
быть в ряду эшелонов. Так что нижняя левая часть матрицы
содержит только нули, и все нулевые строки ниже ненулевых
строк. Слово «эшелон» используется здесь, потому что можно грубо думать о
строки ранжируются по размеру, при этом наибольшее значение находится сверху
и самое маленькое существо внизу.
теперь в основном вы должны хранить расширенную матрицу
float augmentedmatrix[maximum][2*maximum] ;
так что вы можете выполнять операции с матрицей A
и на единичной матрице одновременно.
Заполните идентификационную матрицу:
/* augmenting with identity matrix of similar dimensions */
for(i=0;i<dimension; i++)
for(j=dimension; j<2*dimension; j++)
if(i==j%dimension)
augmentedmatrix[i][j]=1;
else
augmentedmatrix[i][j]=0;
и выполнить исключение Гаусса-Джордана на расширенной матрице:
/* finding maximum jth column element in last (dimension-j) rows */
/* swapping row which has maximum jth column element */
/* performing row operations to form required identity matrix
out of the input matrix */
Чего вам не хватает:
/* using gauss-jordan elimination */
for (j = 0; j < dimension; j++) {
temp = j;
/* finding maximum jth column element in last (dimension-j) rows */
for (i = j + 1; i < dimension; i++)
if (augmentedmatrix[i][j] > augmentedmatrix[temp][j])
temp = i;
if (fabs(augmentedmatrix[temp][j]) < minvalue) {
printf("\n Elements are too small to deal with !!!");
return -1;
}
/* swapping row which has maximum jth column element */
if (temp != j)
for (k = 0; k < 2 * dimension; k++) {
temporary = augmentedmatrix[j][k];
augmentedmatrix[j][k] = augmentedmatrix[temp][k];
augmentedmatrix[temp][k] = temporary;
}
/* performing row operations to form required identity matrix out
of the input matrix */
for (i = 0; i < dimension; i++)
if (i != j) {
r = augmentedmatrix[i][j];
for (k = 0; k < 2 * dimension; k++)
augmentedmatrix[i][k] -= augmentedmatrix[j][k] *
r / augmentedmatrix[j][j];
} else {
r = augmentedmatrix[i][j];
for (k = 0; k < 2 * dimension; k++)
augmentedmatrix[i][k] /= r;
}
}
Других решений пока нет …