线性代数矩阵的逆运算用c语言实现,下面是我的思路:
1. 既然是矩阵,那我就用二维数组去实现
2. 由线性代数的知识可知,逆矩阵可由伴随矩阵去除以他的行列式去得到逆矩阵
3. 计算行列式我就用转化为上三角行列式来做吧
以下是代码细节:
#include<stdio.h>
#include<math.h>
-->这边是要用到的模块
int main()
{ int n,i,j,k,x,y,p,q,P,Q;
float a[100][100],b[100][100],c[100][100],A[100][100],beishu=1.0,hanglieshi=1.0,yuzishi=1.0,daishuyuzishi=1.0;
printf("请输入矩阵的阶数");
scanf("%d",&n);
for (i=0;i<n;i++)
{ printf("请输入第 %d 行的数据",i+1);
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
printf("\n");
}// 获取矩阵
-->这里我们先获取要被转化的矩阵
for(j=0;j<n;j++)
{ for(i=j+1;i<n;i++)
{ beishu=a[i][j]/a[j][j];
for(k=j;k<n;k++)
a[i][k]=a[i][k]-beishu*a[j][k];
}
}// 转化为上三角行列式
-->这边我们把获取的矩阵作为行列式并且通过行变换去得到上三角行列式
for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
{ if(i==j)
hanglieshi=hanglieshi*a[i][j];
}
}
printf("行列式值为%3f \n",hanglieshi);// 计算方阵的行列式
-->这边直接就通过主对角线去相乘去得到行列式的值了
if(hanglieshi==0)
{ printf("该矩阵不存在逆矩阵");
return 0;
}// 判断是否存在逆矩阵,不存在则退出
-->这边很重要,如果行列式值为0,那它就不存在逆矩阵了,所以我们要先判断它是否为0,为0,则退出。
for(i=0;i<n;i++)
{ p=i;
for(j=0;j<n;j++)
{ q=j;
P=0;
for(x=0,p=0;x<n-1;x++,p++)
{ if(x==i&&P==0)
{ p+=1;
P+=1;
}
Q=0;
for(y=0,q=0;y<n-1;y++,q++)
{
if(y==j&&Q==0)
{ q+=1;
Q+=1;
}
A[x][y]=c[p][q];// 创建余子式bingo
}
}
for(y=0;y<n-1;y++)
{ for(x=y+1;x<n-1;x++)// 余子式每行执行
{ beishu=A[x][y]/A[y][y];
for(k=y;k<n-1;k++)
A[x][k]=A[x][k]-beishu*A[y][k];// 余子式每个元素执行
}
}// 余子式转化为上三角行列式
float yuzishi=1.0;
for(x=0;x<n-1;x++)
{ for(y=0;y<n-1;y++)
{ if(x==y)
{
yuzishi*=A[x][y];
}
}
}// 计算余子式
daishuyuzishi=pow((-1),(i+j))*yuzishi;
b[i][j]=daishuyuzishi;
}
}// 计算伴随矩阵b
-->在这边我们通过一个新的二维数组A去获取他的余子式,这边就比较复杂了,思路在代码里备注了。然后我们同理运用上三角行列式去计算余子式的值,在将值乘上它的逆序数(i+j),这边我们用到了幂函数pow( )去计算其是奇排列还是偶排列
for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
b[i][j]/=hanglieshi;
}//根据矩阵的逆=伴随矩阵/行列式运算得到逆矩阵
-->最后我们通过思路里面的公式(逆矩阵=伴随矩阵/行列式)去得到它的逆矩阵
for(i=0;i<n;i++)
{ printf("|");
for(j=0;j<n;j++)
printf(" %f ",b[i][j]);
printf("|\n");
}
printf("\n");// 输出结果
-->最后我们通过二重循环去输出它的值
附:完整代码
#include<stdio.h>
#include<math.h>
int main()
{ int n,i,j,k,x,y,p,q,P,Q;
float a[100][100],b[100][100],c[100][100],A[100][100],beishu=1.0,hanglieshi=1.0,yuzishi=1.0,daishuyuzishi=1.0;
printf("请输入矩阵的阶数");
scanf("%d",&n);
for (i=0;i<n;i++)
{ printf("请输入第 %d 行的数据",i+1);
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
printf("\n");
}// 获取矩阵
for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
c[i][j]=a[i][j];
}//记录初始数据
for(j=0;j<n;j++)
{ for(i=j+1;i<n;i++)
{ beishu=a[i][j]/a[j][j];
for(k=j;k<n;k++)
a[i][k]=a[i][k]-beishu*a[j][k];
}
}// 转化为上三角行列式
for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
{ if(i==j)
hanglieshi=hanglieshi*a[i][j];
}
}
printf("行列式值为%3f \n",hanglieshi);
if(hanglieshi==0)
{ printf("该矩阵不存在逆矩阵");
return 0;
}// 判断是否存在逆矩阵,不存在则退出
for(i=0;i<n;i++)
{ p=i;
for(j=0;j<n;j++)
{ q=j;
P=0;
for(x=0,p=0;x<n-1;x++,p++)
{ if(x==i&&P==0)
{ p+=1;
P+=1;
}
Q=0;
for(y=0,q=0;y<n-1;y++,q++)
{
if(y==j&&Q==0)
{ q+=1;
Q+=1;
}
A[x][y]=c[p][q];// 创建余子式
}
}
for(y=0;y<n-1;y++)
{ for(x=y+1;x<n-1;x++)//
{ beishu=A[x][y]/A[y][y];
for(k=y;k<n-1;k++)
A[x][k]=A[x][k]-beishu*A[y][k];//
}
}// 余子式转化为上三角行列式
float yuzishi=1.0;
for(x=0;x<n-1;x++)
{ for(y=0;y<n-1;y++)
{ if(x==y)
{
yuzishi*=A[x][y];
}
}
}// 计算余子式
daishuyuzishi=pow((-1),(i+j))*yuzishi;
b[i][j]=daishuyuzishi;
}
}// 计算伴随矩阵b
for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
b[i][j]/=hanglieshi;
}//根据矩阵的逆=伴随矩阵/行列式运算得到逆矩阵
for(i=0;i<n;i++)
{ printf("|");
for(j=0;j<n;j++)
printf(" %f ",b[i][j]);
printf("|\n");
}
printf("\n");// 输出结果
return 0;
}