Гауссова обратная матрица исключения

Что делает блок кода, показанный ниже? Я не совсем понимаю

  if (temp != j)
for (k = 0; k < 2 * dimension; k++) {
temporary = augmentedmatrix[j][k];
augmentedmatrix[j][k] = augmentedmatrix[temp][k];
augmentedmatrix[temp][k] = temporary;
}

-3

Решение

Редактировать:
Первоначальный вопрос заключался в том, как вычислить обратную матрицу с помощью исключения Гаусса. ОП застрял на фактической части исключения алгоритма.


Теперь, если элемент 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;
}
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]