C 用b^n次方求矩阵的逆

C 用b^n次方求矩阵的逆,c,matrix,C,Matrix,我已经搜索了几个小时,花了更多的时间试图找出如何解决这个问题。我需要使用 A^-1=I+(B+B^2+…+B^20)其中B=I-A void invA(double a[][3], double id[][3], double z[][3]) { int i, j, n, k; double pb[3][3] = {1.,0.,0.,0.,1.,0.,0.,0.,1.}; double temp[3][3] = {1.,0.,0.,0.,1.,0.,0.,0.,1.}

我已经搜索了几个小时,花了更多的时间试图找出如何解决这个问题。我需要使用
A^-1=I+(B+B^2+…+B^20)
其中
B=I-A

void invA(double a[][3], double id[][3], double z[][3])
{
    int i, j, n, k;
    double pb[3][3]   = {1.,0.,0.,0.,1.,0.,0.,0.,1.};
    double temp[3][3] = {1.,0.,0.,0.,1.,0.,0.,0.,1.};
    double b[3][3];

    temp[i][j] = 0;
    b[i][j]    = 0;

    for(i = 0; i < 3; i++)
        for (j = 0; j < 3; j++)
            b[i][j] = id[i][j] - a[i][j];

    for (n = 0; n < 20; n++)                        //run loop n times
    {
        for (i = 0; i < 3; i++)                     //find b to the power 20
            for (j = 0; j < 3; j++)
                for (k = 0; k < 3; k++)
                    temp[i][j] += pb[i][k] * b[k][j];

        for (i = 0; i < 3; i++)                      //allocate pb from temp
            for (j = 0; j < 3; j++) 
                pb[i][j] = temp[i][j];

        for (i = 0; i < 3; i++)                       //summing b n time
            for (j = 0; j < 3; j++)                   //to find inverse
                z[i][j] = z[i][j] + pb[i][j];
    }
}
void invA(双a[][3],双id[][3],双z[][3])
{
int i,j,n,k;
双pb[3][3]={1,0,0,0,0,1,0,0,0,0,1};
双温[3][3]={1,0,0,0,0,1,0,0,0,0,1};
双b[3][3];
温度[i][j]=0;
b[i][j]=0;
对于(i=0;i<3;i++)
对于(j=0;j<3;j++)
b[i][j]=id[i][j]-a[i][j];
对于(n=0;n<20;n++)//运行循环n次
{
对于(i=0;i<3;i++)//找到b的幂20
对于(j=0;j<3;j++)
对于(k=0;k<3;k++)
温度[i][j]+=pb[i][k]*b[k][j];
对于(i=0;i<3;i++)//从temp分配pb
对于(j=0;j<3;j++)
pb[i][j]=温度[i][j];
对于(i=0;i<3;i++)//求和b n次
对于(j=0;j<3;j++)//求逆
z[i][j]=z[i][j]+pb[i][j];
}
}
矩阵
a
是定义的矩阵,
id
是恒等式,
z
是逆矩阵(结果)。我似乎想不出哪里出了错

你没有什么问题

首先,
temp[i][j]=0
b[i][j]=0
在函数开头使用未初始化变量
i
j
。行为未定义,谁知道
temp
实际上是如何初始化的

然后,在每次迭代时,
temp
必须重新初始化为零矩阵。我不知道你的代码到底计算了什么,但这不是一个确定的能力

最后,(除非
z
初始化为
I
),否则缺少初始项

综上所述,我强烈建议将大部分循环分解成函数:
matAdd()
matMult()
。一旦单元测试完成,剩下的就简单多了。

您几乎没有问题

首先,
temp[i][j]=0
b[i][j]=0
在函数开头使用未初始化变量
i
j
。行为未定义,谁知道
temp
实际上是如何初始化的

然后,在每次迭代时,
temp
必须重新初始化为零矩阵。我不知道你的代码到底计算了什么,但这不是一个确定的能力

最后,(除非
z
初始化为
I
),否则缺少初始项


综上所述,我强烈建议将大部分循环分解成函数:
matAdd()
matMult()
。一旦对它们进行了单元测试,剩下的就简单多了。

为了澄清,我需要
for(n=0;n<20;n++)
来计算B矩阵的1到20的幂。然后我需要求B到B^20的所有值的和。最后,将该和与单位矩阵相加,得到逆矩阵。我想在这篇文章之后我有了一个想法。欢迎来到Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票选出好的问题和有用的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有用的答案(这也会给你的声誉带来一点提升)。请参见本页,并且为了澄清,我需要
(n=0;n<20;n++)
来计算B矩阵的1到20的幂。然后我需要求B到B^20的所有值的和。最后,将该和与单位矩阵相加,得到逆矩阵。我想在这篇文章之后我有了一个想法。欢迎来到Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票选出好的问题和有用的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有用的答案(这也会给你的声誉带来一点提升)。请看这一页,我不敢相信我错过了第一页。我理解第二个。但是第三项呢?在
invA()
中,我的
z[][3]
是在我的
int main()
@Chris Re第三项中初始化的,这正是我的意思。如果看不到
main
,就很难判断
z
确实被初始化为一个标识。我强烈建议在invA中做这件事。我不敢相信我错过了第一件。我理解第二个。但是第三项呢?在
invA()
中,我的
z[][3]
是在我的
int main()
@Chris Re第三项中初始化的,这正是我的意思。如果看不到
main
,就很难判断
z
确实被初始化为一个标识。我强烈建议您在
invA
中执行此操作。