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
中执行此操作。