#include <stdlib.h> #define N 20
#include <iostream> using namespace std;
float b1[N][2*N]; /*用于存放原矩阵扩展后的n*2n矩阵*/ float a[N][N]; /*用于存放输入的矩阵*/ float b[N][N]; /*与原矩阵相同*/ float e[N][N]; /*单位矩阵*/ float c[N][N]; /*用于存放求出的逆矩阵*/ float x[(N-1)*(N-1)];
int n; /*矩阵的阶数*/
float JudgeMatrix(float a[N][N],int n); /*用于判断原矩阵是否存在逆矩阵*/ void BuildE(int n); /*建立单位矩阵*/ void Enlarge(float a[N][N], float e[N][N],int n); /*扩展原矩阵*/ void ShangSanJiao(float b1[N][2*N],int n); /*把扩展后的矩阵的前一半化为上三角*/ void DuiJiaoXian(float b1[N][2*N],int n); /*把前一半化为上三角后的扩展矩阵的前一半的对角线元素化1*/ void DanWei(float b1[N][2*N]); /*把前一半的对角线化1后的扩展矩阵的前一半化为单位矩阵*/ void QuChu(float b1[N][2*N]); /*把进行初等变换后的扩展矩阵的后一半取出*/ void Error(void); /*若输入数据出错,显示错误*/
int Input() /*用于输入矩阵阶数和矩阵各元素*/ { int i,j;
printf("请输入是几阶矩阵: "); scanf("%d",&n); /*输入矩阵阶数*/ if(n>20) /*判断输入的矩阵的阶数是否过大*/ { printf("输入矩阵过大!\n"); Error(); }
for(i=0;i<n;i++) { printf("请按顺序输入矩阵的第 %d 行元素:\n",i); for(j=0;j<n;j++) { scanf("%f",&a[i][j]); /*输入矩阵各元素*/ } } for(i=0;i<n;i++) { for(j=0;j<n;j++) { b[i][j]=a[i][j]; printf("%f ",a[i][j]); /*输出原矩阵*/ } printf("\n"); } return n; }
void BuildE(int n) /*建立一个n阶的单位矩阵e*/ {int i,j;
for(i=0;i<n;i++) { for(j=0;j<n;j++) { e[i][j]=0; /*把矩阵的所有元素赋值为0*/ } } for(i=0;i<n;i++) { e[i][i]=1; /*把1赋值给矩阵的对角线元素*/ }
printf("单位矩阵为:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%f ",e[i][j]); /*输出单位矩阵*/ } printf("\n"); }
}
void Enlarge(float b[N][N],float e[N][N],int n)/*建立一个n*2n的矩阵b1,把原矩阵a赋值给前一半,把单位矩阵e赋值给另一半*/ { int i,j; int m2,n2,k; for(m2=0;m2<n;m2++) { for(n2=0;n2<n;n2++) b1[m2][n2]=b[m2][n2]; /*把原矩阵的元素赋值给n*2n矩阵的前一半*/ for(k=0,n2=n;k<n,n2<2*n;k++,n2++) b1[m2][n2]=e[m2][k]; /*把单位矩阵赋值给n*2n矩阵的后一半*/ }
printf("扩展后矩阵为:\n"); for(i=0;i<n;i++) { for(j=0;j<2*n;j++) { printf("%f ",b1[i][j]); /*输出扩展后的矩阵*/ } printf("\n"); }
}
void ShangSanJiao(void) /*把矩阵前一半化为上三角矩阵*/ { int k,m2,n2,i,l,j; float s[2*N]; if(b1[0][0]==0) /*判断矩阵的第0行第0个元素是否是0,若是,查找下面的第0列第i行元素是否是0,若不是,把这行与第一行交换*/ { l=1; while(b1[l][0]==0&&l<n-1) { l++; } for(j=0;j<2*n;j++) { s[j]=b1[l][j]; b1[l][j]=b1[0][j]; b1[0][j]=s[j]; }
printf("juzhne:\n"); /*若矩阵的行进行了交换,则输出进行行交换后的矩阵*/ for(i=0;i<n;i++) { for(j=0;j<2*n;j++) { printf("%f ",b1[i][j]); } printf("\n"); } } for(k=0;k<n-1;k++) /*把n*2n矩阵的前一半化为上三角*/ { for(m2=k+1;m2<n;m2++) x[m2]=b1[m2][k]/b1[k][k]; for(m2=k+1;m2<n;m2++) { for(n2=0;n2<2*n;n2++) b1[m2][n2]=b1[m2][n2]-b1[k][n2]*x[m2]; } }
printf("上三角矩阵b1:\n"); for(m2=0;m2<n;m2++) /*把矩阵前一半化成上三角后的矩阵输出*/ { for(n2=0;n2<2*n;n2++) printf("%f ", b1[m2][n2]); printf("\n"); } printf("\n");
}
void DuiJiaoXian(float b1[N][2*N],int n) /*把矩阵前一半的对角线上元素化1*/ { int m2,n2,i; for(m2=n-1,i=n-1;m2>=0,i>=0;m2--,i--) { x[i]=b1[m2][m2]; } for(m2=n-1,i=n-1;m2>=0,i>=0;m2--,i--) { for(n2=0;n2<2*n;n2++)
b1[m2][n2]=b1[m2][n2]/x[i]; }
printf("对角线为1的矩阵b1:\n"); for(m2=0;m2<n;m2++) /*把矩阵前一半的对角线上化1后输出*/ { for(n2=0;n2<2*n;n2++) printf("%f ", b1[m2][n2]); printf("\n"); }
printf("\n");
}
void DanWei(void) /*把矩阵前一半化为单位矩阵*/ { int m2,n2,k,i; for(m2=0;m2<n-1;m2++) { for(k=m2+1,i=1;k<n,i<n;k++,i++) { x[i]=b1[m2][k]; for(n2=0;n2<2*n;n2++) b1[m2][n2]=b1[m2][n2]-b1[k][n2]*x[i]; } }
printf("前一半为单位矩阵的矩阵b1:\n"); for(m2=0;m2<n;m2++) /*把矩阵前一半化为单位矩阵后输出*/ { for(n2=0;n2<2*n;n2++) printf("%f ", b1[m2][n2]); printf("\n"); }
printf("\n"); }
void QuChu(void) /*把矩阵b1的前一半赋值给c并输出,即为原矩阵的逆矩阵*/ {int i,j,m;
for(i=0;i<n;i++) { for(j=0,m=n;j<n,m<2*n;j++,m++) c[i][j]=b1[i][m]; }
printf("要求的逆矩阵是:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%f ",c[i][j]); /*输出求出的逆矩阵*/ printf("\n"); }
}
float JudgeMatrix(float a[N][N],int n) /*判断原矩阵是否存在逆矩阵*/ { int i,j,k,l ; float D=1.0 ; float s[N]; if(a[0][0]==0) /*判断矩阵的第0行第0个元素是否是0,若是,查找下面的第0列第i行元素是否是0,若不是,把这行与第一行交换*/ { l=1; while(a[l][0]==0&&l<n-1) { l++; } for(j=0;j<n;j++) { s[j]=a[l][j]; a[l][j]=a[0][j]; a[0][j]=s[j]; } } printf("juzhne:\n"); /*若矩阵的行进行了交换,则输出进行行交换后的矩阵*/ for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%f ",a[i][j]); } printf("\n"); } for(k=0;k<n-1;k++) /*把矩阵化为上三角矩阵*/ { for(i=k+1;i<n;i++) x[i]=a[i][k]/a[k][k]; for(i=k+1;i<n;i++) { for(j=0;j<n;j++) a[i][j]=a[i][j]-a[k][j]*x[i]; } } for(i=0,j=0;i<n,j<n;i++,j++) /*求出矩阵的矩阵的行列式的值*/ D=D*a[i][j]; return(D); }
void Error(void) /*显示错误并退出程序*/ { printf("Input ERROR!\n"); exit(1); }
void main() {
Input(); /*调用输入函数*/
if(JudgeMatrix(a,n)==0) /*调用JudgeMatrix函数,判断矩阵是否存在逆矩阵*/ { printf("D=0,没有逆矩阵!"); exit(1); /*不存在逆矩阵,退出程序*/ } BuildE(n); Enlarge(b,e,n); ShangSanJiao(); DuiJiaoXian(b1,n); DanWei(); QuChu(); } 请多多指教!