标题:
C语言经典算法之逆阵:逆矩阵
[打印本页]
作者:
苹果也疯狂
时间:
2014-5-9 17:20
标题:
C语言经典算法之逆阵:逆矩阵
#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<n;z++)
{
for(j=0;j<n-1;j++)
for(k=0;k<n-1;k++)
if(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<n;z++)
{l=z;
for(j=0;j<n;j++)
{ m=j;
for(k=0;k<n-1;k++)
for(g=0;g<n-1;g++)
{ if(g>=m&&k<l)a[k][g]=s[k][g+1];
elseif(k>=l&&g<m) a[k][g]=s[k+1][g];
elseif(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<N;z++) /*
输入所需要的数据,为整型数据
*/
for(j=0;j<N;j++)
scanf("%d",&a[z][j]);
printf("\nPress Entercontinue......");
getchar();
//gotoxy(1,1);
printf("The original matrixis:\n");
for(z=0;z<N;z++)/*
打印原矩阵
*/
{for(j=0;j<N;j++)
printf("%5d",a[z][j]);
printf("\n");
}
r=js(a,N); /*
调用
js()
函数计算原矩阵的行列式值
*/
printf("\nThe original matrixhanglieshi is:|A|==%d\n",r);
if (r==0) printf("Because |A|==0,theoriginal matrix have no nijuzhen!"); /*
判断条件
:
若
|A|==0
,则原矩阵无逆矩阵,反之则存在逆矩阵
*/
else
{n_1(a,b,N); /*
调用
n_1()
函数,得到原矩阵各元素对应的
"
余子式
",
存放在数组
b[N][N]
中
*/
for(z=0;z<N;z++) /*
求代数余子式,此时
b[N][N]
中存放的为原矩阵各元素对应的
"
代数余子式
"*/
for(j=0;j<N;j++)
if((z+j)%2!=0 &&b[z][j]!=0) b[z][j]=-b[z][j];
for(z=0;z<N;z++) /*
对
b[N][N]
转置
,
此时
b[N][N]
中存放的为原矩阵的伴随矩阵
*/
for(j=z+2;j<N;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<N;z++)/*
打印伴随矩阵
A* */
{for(j=0;j<N;j++)
printf("%4.0f\t",b[z][j]);
printf("\n");
}
for(z=0;z<N;z++) /*
求逆矩阵,此时
b[N][N]
中存放的是原矩阵的逆矩阵
*/
for(j=0;j<N;j++)
b[z][j]=b[z][j]/r;
printf("\nThe nijuzhen is
A*)/|A|(|A|=%d)\n",r); /*
打印逆矩阵
*/
for(z=0;z<N;z++)
{for(j=0;j<N;j++)
printf("%8.3f",b[z][j]);
printf("\n");
}
}
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0