标题:
C语言经典算法之逆阵:逆阵
[打印本页]
作者:
苹果也疯狂
时间:
2014-5-9 17:21
标题:
C语言经典算法之逆阵:逆阵
#include "stdio.h"
float z[4][4],*y=z; /*
定义一个全局二维数组用来存放
N-1
阶余子式
,
因为
A
的伴随矩阵除以
|A|
时会产生小数,因此定义成
float
而非
int*/
int js(int *p,int n) /*
计算行列式的函数
*/
{int k=0,i,s2=0,s1=0,j,s,t;
printf("\n");
for(j=0;j<n;j++)
{k=j;t=1;
for(i=1;i<=n;i++)
{ t=t*p[k];
if((k+1)%n==0) k=k+1;
else k=k+n+1;
}
s1=s1+t;
}
for(j=0;j<n;j++)
{k=j;t=1;
for(i=1;i<=n;i++)
{ t=t*p[k];
if(k%n==0) k=k+(2*n-1);
else k=k+(n-1);
}
s2=s2+t;
}
s=s1-s2;
return s;
}
void n_1(int b[][4]) /*
把除第
i
行
j
列后的
N-1
阶矩阵的每个元素赋给一维数组
d[]
的函数
*/
{int i,j,e,f,l,m,d[9],*q='\0';
int js(int *p,int n);
printf("\n");
for(i=0;i<4;i++)
{l=i;
for(j=0;j<4;j++)
{ m=j;q=d;
for (e=0;e<4;e++)
{ if(e==l) continue;
for(f=0;f<4;f++)
{ if(f==m) continue;
*q=b[e][f];
q++;
}
}
/*
每得到一个一维数组
d[]
的值,便调用
JS()
函数
,
得到除第
i
行
j
列后的
N-1
阶矩阵的行列式的值
,
也即是余子式
M[j]*/
*(y++)=js(d,3); /*
并把余子式的值存放在全局二维数组
z[]
中
*/
}
}
}
prt(int *p,int n) /*
矩阵打印函数
*/
{int i;
for(i=0;i<n*n;i++)
{if(i%n==0) printf("\n");
printf("%4d",p);
}
}
main()
{inta[4][4]={1,2,3,4,5,6,7,8,9,9,11,12,13,14,15,16};
int m=4,r,i,j,ch;
printf("The old juzhen is:\n");
prt(*a,m);
r=js(*a,m);
printf("\nThe old juzhen hanglieshiis:|A|==%d",r);
printf("\nPress Entercontinue......"); /*
控制屏幕
*/
ch=getchar();
if (r==0) printf("Because |A|==0,thejuzhen have no nijuzhen!");
else
{n_1(a); /*
调用
n_1()
函数
*/
for(i=0;i<m;i++) /*
求代数余子式
*/
for(j=0;j<m;j++)
if((i+j)%2!=0 &&z
[j]!=0) z
[j]=-z
[j];
printf("Because |A|!=0,the juzhen have nijuzhen!\n");
printf("The bansuijuzhen A* is:\n"); /*
打印伴随矩阵
A* ,i,j
对调用于转置
*/
for(i=0;i<m;i++)
{for(j=0;j<m;j++)
if ((i+j)%2==0)printf("%4.0f\t",z[j]
);
else
printf("%4.0f\t",z
[j]);
printf("\n");
}
printf("\nThe nijuzhen is
*A)/|A|\n");
for(i=0;i<m;i++) /*
打印
A
的逆矩阵
*/
{for(j=0;j<m;j++)
if ((i+j)%2==0) printf("%.3f\t",z
[j]/r);
else
printf("%.3f\t",z[j]
/r);
printf("\n");
}
}
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0