⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 revers matrix.txt

📁 一个朋友编的C语言通用广义逆矩阵求解算法
💻 TXT
字号:
#include <stdio.h> 
#include <math.h> 
#include <malloc.h> 
void main() 
{ 
int n; 
printf("请输入你所求解的逆矩阵的阶数:n="); 
scanf("%d",&n); 
float choose_the_main(float **a,float *b,int k,int n); 
void input_output(float **a,float **c,float **q,int n); 
void course(float **a,float **c,float **q,float *b,int n); 
float **a,*b,**c,**q; 
int i; 

a=(float **)malloc(sizeof(float *)*n); 
b=(float *)malloc(sizeof(float )*n); 
c=(float **)malloc(sizeof(float *)*n); 
q=(float **)malloc(sizeof(float *)*n); 
for(i=0;i<n;i++) 
{ 
*(a+i)=(float *)malloc(sizeof(float )*n); 
*(c+i)=(float *)malloc(sizeof(float )*n); 
*(q+i)=(float *)malloc(sizeof(float )*n); 
} 
printf("您现在做的是%d阶矩阵的逆矩阵求解\n",n); 
input_output(a,c,q,n); 
course(a,c,q,b,n); 
} 
float choose_the_main(float **a,float *b,int k,int n) 
{ 
float d,t; 
int l,i,j; 
d=a[k-1][k-1]; 
l=k-1; 
for(i=k;i<n;i++) 
{ 
if(fabs(a[i][k-1]>fabs(d))) 
{ 
d=a[i][k-1]; 
l=i; 
} 
} 
if(d==0) 
printf("The system is error!\n"); 
else 
{ 
if(l!=k-1) 
{ 
for(j=k-1;j<n;j++) 
{ 
t=a[l][j]; 
a[l][j]=a[k-1][j]; 
a[k-1][j]=t; 
} 
t=b[l];b[l]=b[k-1];b[k-1]=t; 
} 
} 
return (d); 
} 
void input_output(float **a,float **c,float **q,int n) 
{ 
int i,j; 
printf("请按行的顺序依次输入矩阵中元素的值(共%d项):",n*n); 
for(i=0;i<=n-1;i++) 
for(j=0;j<=n-1;j++) 
scanf("%f",&a[i][j]); 
for(i=0;i<n;i++) 
for(j=0;j<=n-1;j++) 
{ 
if(i==j) c[i][j]=1; 
else c[i][j]=0; 
q[i][j]=a[i][j]; 
} 
printf("您输入的(AE)矩阵为(利用(AE)-->(E(A的逆)):\n"); 
for(i=0;i<=n-1;i++) 
{ 
for(j=0;j<=n-1;j++) 
printf("%.5f ",a[i][j]); 
for(j=0;j<=n-1;j++) 
printf("%.5f ",c[i][j]); 
printf("\n"); 
} 
printf("\n"); 
} 
void course(float **a,float **c,float **q,float *b,int n) 
{ 
float sum=0,h; 
int i,j,k,p,flag=0; 
for(p=0;p<n;p++) 
{ 
for(j=0;j<n;j++) 
b[j]=c[j][p]; 
for(i=0;i<n;i++) 
for(j=0;j<=n-1;j++) 
{ 
a[i][j]=q[i][j]; 
} 
for(k=1;k<=n-1;k++) 
{ 

h=choose_the_main(a,b,k,n); 
if(h==0) 
{ 
printf("因为矩阵的行列式的值为0,所以不能用此程序做!程序退出!\n"); 
flag=1; 
break; 
} 
else 
{ 
for(i=k;i<n;i++) 
a[i][k-1]=a[i][k-1]/a[k-1][k-1]; 
for(i=k;i<n;i++) 
for(j=k;j<n;j++) 
a[i][j]=a[i][j]-a[i][k-1]*a[k-1][j]; 
for(i=k;i<n;i++) 
b[i]=b[i]-(a[i][k-1]*b[k-1]); 
} 
} 
if(flag==1) break; 
if(h!=0) 
{ 
b[n-1]=b[n-1]/a[n-1][n-1]; 
for(i=n-2;i>=0;i--) 
{ 
for(j=i+1;j<n;j++) 
sum=sum+a[i][j]*b[j]; 
b[i]=(b[i]-sum)/a[i][i]; 
sum=0; 
} 
for(j=0;j<n;j++) 
c[j][p]=b[j]; 

} 
} 
if(flag==0) 
{ 
printf("所求矩阵的逆矩阵为:\n"); 
for(i=0;i<=n-1;i++) 
{ 
for(j=0;j<=n-1;j++) 
printf("%.5f ",c[i][j]); 
printf("\n"); 
} 
} 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -