Я пытаюсь инвертировать матрицу 3х3. Я определяю увеличение, которое имеет как исходную, так и единичную матрицу. В зависимости от размеров матрицы, единичная матрица генерируется отдельной функцией с единицами 1 вдоль главной диагонали и нулями повсюду в другом месте. После завершения операций исходная матрица должна быть идентичностью, а идентичность должна быть обратной. Я могу успешно превратить оригинал в идентичность, но что-то мешает исходной идентичности полностью стать обратной, что сбивает с толку, потому что оба массива находятся внутри одних и тех же циклов.
const int m = 3;
const int n = 3;
double matrix[m][n];
double ID[m][n] = {};
double pivot;
for(s = 1;s <= m;++s){
pivot = matrix[s-1][s-1];
k = s + 1;
for(i = n;i >= 1;--i){ // makes leading entries 1
ID[s-1][i-1] = ID[s-1][i-1]/pivot;
matrix[s-1][i-1] = matrix[s-1][i-1]/pivot;
}
for(j = k;j <= m;++j){ //converts to upper triangular
for(i = n;i >= 1;--i){
ID[j-1][i-1] = ID[j-1][i-1] - ID[s-1][i-1]*matrix[j-1][s-1]; //*****<--- has no effect on ID[2][0]
matrix[j-1][i-1] = matrix[j-1][i-1] - matrix[s-1][i-1]*matrix[j-1][s-1];
}
}
} //ID[2][0] = 0; <--- gives correct answer when uncommented
for(s = m;s >= 1;--s){
k = s - 1;
for(j = k;j >= 1;--j){ //makes entries above diagonal zero
for(i = 1;i <= n;++i){
ID[j-1][i-1] = ID[j-1][i-1] - ID[s-1][i-1]*matrix[j-1][s-1];
matrix[j-1][i-1] = matrix[j-1][i-1] - matrix[s-1][i-1]*matrix[j-1][s-1];
}
}
}
Вот процесс по рука, большая стрелка указывает на то, где, по моему мнению, мой код застревает. ID[2][0]
остается как -1, что, в свою очередь, не позволяет установить ID[0][0]
на -3 по сравнению с последним методом l oop.
с правильным результатом
результат без принудительного ввода идентификатора (2) [0] в 0
результат принудительного ввода идентификатора (2) [0] в 0
Не знаю Я не понимаю, что происходит, так как l oop отлично работает на matrix[m][n]
.