用c语言求解逆矩阵(c语言)!

2025-03-15 17:42:56
推荐回答(1个)
回答1:

# include "stdio.h"
# define M 3

void main ( )

{
float MAT[M][2*M];
float MAT1[M][M];
float t;
int i,j,k,l;

/***********************************************/

/*对矩阵进行初始化*/
for(i=0;i for(j=0;j<2*M;j++)
MAT1[j]='\0';

for(i=0;i for(j=0;j<2*M;j++)
MAT[j]='\0';

/*对MAT1矩阵赋初值 */
for(i=0;i for (j=0;j scanf("%f",&MAT1[j]);

/*打印目标矩阵?*/
printf("原矩阵为:\n");
for (i=0;i {
for (j=0;jprintf("%5.2f",MAT1[j]);
printf("\n");
}

/********************************************/

/*对MAT1矩阵进行扩展,MAT1矩阵添加单位阵,由M*M变成2M*2M矩阵 */
for(i=0;i for(j=0;j<2*M;j++)
if (j else if (j==M+i) MAT[j]=1;
else MAT[j]=0;

/*对M矩阵进行变换,使得前半部分矩阵成为单位阵,则 */
/*后半部分矩阵即为所求矩阵逆阵 */
for(i=0;i {
/*对第i行进行归一化 */
for (j=0;j<2*M;j++)
for(k=i+1;kMAT[j]=MAT[j]+MAT[k][j];
t=MAT;
for(j=i;j<2*M;j++)
MAT[j]=MAT[j]/t;

/*对矩阵进行行变换,使得第i 列只有一个元素不为零,且为1*/
for(k=0;kif(k!=i)
{
t=MAT[k];
for (l=i;l<2*M;l++)
MAT[k][l]=MAT[k][l]-MAT[l]*t;
}
}

/*将后半部分矩阵即所求矩阵逆阵存入MAT2矩阵。*/
for(i=0;i {

for(j=0;j MAT1[j]=MAT[j+M];
printf("\n");

}

/*********************************************/

/*输出所求的逆阵*/
printf("逆阵为:\n");
for(i=0;i {

for(j=0;j printf("%5.2f",MAT1[j]);
printf("\n");
}

}

[楼 主] From:局域网 | Posted:2007-10-08 00:11|

情有独中

级别: 论坛版主
精华: 0
发帖: 8
威望: 8 点
金钱: 36 RMB
在线时间:0(小时)
注册时间:2007-10-08
最后登陆:2007-10-07
--------------------------------------------------------------------------------

#define N 5 /*[注]:修改6为你所要的矩阵阶数*/
#include "stdio.h"
#include "conio.h"

/*js()函数用于计算行列式,通过递归算法实现*/
int js(s,n)
int s[][N],n;
{int z,j,k,r,total=0;
int b[N][N];/*b[N][N]用于存放,在矩阵s[N][N]中元素s[0]的余子式*/
if(n>2) {for(z=0;z{for(j=0;jfor(k=0;kif(k>=z) b[j][k]=s[j+1][k+1];
else b[j][k]=s[j+1][k];
if(z%2==0) r=s[0][z]*js(b,n-1); /*递归调用*/
else r=(-1)*s[0][z]*js(b,n-1);
total=total+r;
}
}
else if(n==2) total=s[0][0]*s[1][1]-s[0][1]*s[1][0];
return total;
}

/*n_1()函数用于求原矩阵各元素对应的余子式,存放在数组b[N][N]中,定义为float型*/
void n_1(s,b,n)
int s[][N],n;
float b[][N];
{int z,j,k,l,m,g,a[N][N];
for(z=0;z {l=z;
for(j=0;j{ m=j;
for (k=0;k for(g=0;g{ if(g>=m&&k else if(k>=l&&g else if(k>=l&&g>=m) a[k][g]=s[k+1][g+1];
else a[k][g]=s[k][g];
}
b[z][j]=js(a,n-1);
}
}
}

main()
{int a[N][N];
float b[N][N];
int r,z,j;
float temp;
//clrscr();
printf("Input original data:\n");
for(z=0;z for(j=0;jscanf("%d",&a[z][j]);
printf("\nPress Enter continue......");
getchar();
//gotoxy(1,1);
printf("The original matrix is:\n");
for(z=0;z {for(j=0;jprintf("%5d",a[z][j]);
printf("\n");
}
r=js(a,N); /*调用js()函数计算原矩阵的行列式值*/
printf("\nThe original matrix hanglieshi is:|A|==%d\n",r);
if (r==0) printf("Because |A|==0,the original matrix have no nijuzhen!"); /*判断条件:若|A|==0,则原矩阵无逆矩阵,反之则存在逆矩阵*/
else
{n_1(a,b,N); /*调用n_1()函数,得到原矩阵各元素对应的"余子式",存放在数组b[N][N]中*/
for(z=0;z for(j=0;j if((z+j)%2!=0 && b[z][j]!=0) b[z][j]=-b[z][j];
for(z=0;zfor(j=z+2;j{temp=b[z][j];
b[z][j]=b[j][z];
b[j][z]=temp;
}
printf("Because |A|!=0,the original matrix have nijuzhen!\n");
printf("The bansuijuzhen A* is:\n");
for(z=0;z {for(j=0;j printf("%4.0f\t",b[z][j]);
printf("\n");
}

for(z=0;z for(j=0;jb[z][j]=b[z][j]/r;
printf("\nThe nijuzhen is:(A*)/|A|(|A|=%d)\n",r); /*打印逆矩阵*/
for(z=0;z {for(j=0;jprintf("%8.3f",b[z][j]);
printf("\n");
}
}
}