繁体   English   中英

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

[英]Matrix inversion via Gaussian Elimination

我现在专注于 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 所以我必须在事后手动将其强制为零。

除了其他基本行操作(例如基于前导条目 position 交换行)之外,我的代码的主要部分包括以下内容:

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] 做的事情,以将其减少为行梯形形式,就像使用增广矩阵一样。 行操作非常随意,因为我只是在做任何使 matrix[m][n] 成为单位矩阵的工作。 之后,我只是在其中插入了 ID[m][n] ......不太确定发生了什么,但结果对了一半。

我的结果正确答案

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

在 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的 memory 位置(例如ID[n][n] ),其中包含一些未知值。

您必须使用循环遍历您的 arrays,例如

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

或者如果你愿意

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

但我发现最后一个解决方案非常令人困惑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM