通过高斯消除进行矩阵求逆

时间:2020-04-03 09:58:53

标签: c++ arrays

由于我的代码易变,我现在专注于3x3矩阵。我从文本文件中读取矩阵并打印到控制台,根据其尺寸生成身份矩阵。

const int m = 3;
const int n = 3;

int ID[m][n] = {};

for (i = 1; i <= n; ++i){

        ID[i][i] = 1;
}     

由于某种原因,ID(2)[3]被打印为4227276,因此我必须在事后手动将其强制为零。

除了其他基本的行操作(例如根据开头的入口位置交换行)之外,我的代码的主要块还包括以下内容:

float matrix[m][n];

int i,j,k,p,s;

for(s = 1;s <= m;++s){
        j = s;
        k = j + 1;
        p = j;

        for(i = n;i >= j;--i){                    // makes leading entries 1

                ID[j][i] = ID[j][i]/matrix[j][j];
                matrix[j][i] = matrix[j][i]/matrix[j][j];

            }

            for(j = k;j <= m;++j){             //converts to upper triangular

                for(i = n;i >= 1;--i){

                    ID[j][i] = ID[j][i] - matrix[j][i]*matrix[p][i];
                    matrix[j][i] = matrix[j][i] - matrix[j][i]*matrix[p][i];

                }

            }
    }
            for(j = (m-1);j >= 1;--j){    //makes entries above diagonal zero

                for(i = n;i > j;--i){

                    ID[j][i] = ID[j][i] - matrix[j][i]*matrix[i][i];
                    matrix[j][i] = matrix[j][i] - matrix[j][i]*matrix[i][i];

                }

            }

基本上,我对恒等矩阵的处理与对matrix [m] [n]的处理一样,就像将其与增强矩阵一样简化为行梯形形式。行操作是很随意的,因为我只是在做任何使矩阵[m] [n]成为恒等矩阵的工作。然后,我只是在其中插入ID [m] [n] ...不确定是否发生什么,但结果是正确的一半。

my result right answer

我意识到我从ID减去的术语可能需要是ID的倍数,但这会使情况更糟。我犯了什么错误?

1 个答案:

答案 0 :(得分:0)

在C ++中,n维数组的索引从0到n-1:因此数组a的第一个元素是a[0],第二个元素是a[1], ...,第n个元素是a[n-1]

使用for

for (i = 1; i <= n; ++i){
        ID[i][i] = 1;
}     

您将舍弃每一行和每一列的前几个元素,然后访问不属于包含某些未知值的ID(例如ID[n][n])的内存位置。

您必须使用诸如以下的循环来遍历数组

for (i = 0; i < n; ++i){
        ID[i][i] = 1;
} 

或者如果您愿意

for (i = 1; i <= n; ++i){
        ID[i-1][i-1] = 1;
}  

但是我发现最后的解决方案很混乱。