/* *姓名:chenjieb520 *班级:JMU JSJ0611 *时间:2009年08月11日 */ #include <stdlib.h> #include <stdio.h> //矩阵的数据结构 typedef struct Matrix{ double **Ma; int RowNum; int ColNum; }Matrix; //创建矩阵 Matrix CreateMatrix() { int i,j; Matrix M; scanf("%d%d",&M.RowNum,&M.ColNum); M.Ma=(double**)malloc(M.RowNum*sizeof(double*)); for (i=0;i<M.RowNum;i++) { M.Ma[i]=(double*)malloc(M.ColNum*sizeof(double)); } for (i=0;i<M.RowNum;i++) { for (j=0;j<M.ColNum;j++) { scanf("%lf",&M.Ma[i][j]); } } return M; } //显示矩阵 void ShowMatrix(Matrix M) { for (int i=0;i<M.RowNum;i++) { for (int j=0;j<M.ColNum;j++) { printf("%-.2lf ",M.Ma[i][j]); } printf("\n"); } } //求矩阵去掉某一行某一列后剩下的矩阵,其中r为行,c为列 Matrix leftMatrix(Matrix M,int r,int c) { Matrix M1; M1.ColNum=M.ColNum-1; M1.RowNum=M.RowNum-1; M1.Ma=(double**)malloc(M1.RowNum*sizeof(double*)); for (int p=0;p<M1.RowNum;p++) { M1.Ma[p]=(double*)malloc(M1.ColNum*sizeof(double)); } int h=0; for (int i=0;i<M.RowNum;i++) { if (i==r) { continue; } for (int j=0,k=0;j<M.ColNum;j++) { if (j==c) { continue; } M1.Ma[h][k++]=M.Ma[i][j]; } h++; } return M1; } //根据奇偶数给符号 int Sign(int n) { if (n%2==0) { return 1; }else { return -1; } } //求行列式的值 double Det(Matrix M) { double sum=0; if (M.ColNum!=M.RowNum) { return 99999; }if (M.RowNum==1) { sum=M.Ma[0][0]; }else if (M.RowNum==2) { sum=M.Ma[0][0]*M.Ma[1][1]-M.Ma[0][1]*M.Ma[1][0]; }else { for (int i=0;i<M.RowNum;i++) { sum+=Sign(0+i)*M.Ma[0][i]*Det(leftMatrix(M,0,i)); } } return sum; } //矩阵乘以一个常数 Matrix MulConstanst(Matrix M,double k) { for (int i=0;i<M.RowNum;i++) { for (int j=0;j<M.ColNum;j++) { M.Ma[i][j]=k*M.Ma[i][j]; } } return M; } //求伴随矩阵 Matrix FollowMatrix(Matrix M) { Matrix M1; M1.ColNum=M.ColNum; M1.RowNum=M.RowNum; M1.Ma=(double**)malloc(M1.RowNum*sizeof(double*)); for (int p=0;p<M1.RowNum;p++) { M1.Ma[p]=(double*)malloc(M1.ColNum*sizeof(double)); } for (int i=0;i<M.RowNum;i++) { for (int j=0;j<M.ColNum;j++) { M1.Ma[j][i]=Sign(i+j)*Det(leftMatrix(M,i,j)); } } return M1; } //求矩阵的逆(要先确保矩阵有逆存在) Matrix InverseMatrix(Matrix M) { Matrix M1; M1.RowNum=M.RowNum; M1.ColNum=M.ColNum; M1.Ma=(double**)malloc(M1.RowNum*sizeof(double*)); for (int p=0;p<M1.RowNum;p++) { M1.Ma[p]=(double*)malloc(M1.ColNum*sizeof(double)); } M1=MulConstanst(FollowMatrix(M),1.0/Det(M)); return M1; } //求矩阵的乘积,要确保可乘 Matrix MulMatrix(Matrix M1,Matrix M2) { Matrix M3; M3.RowNum=0; M3.ColNum=0; if (M1.ColNum==M2.RowNum) { int i,j,k; M3.RowNum=M1.RowNum; M3.ColNum=M2.ColNum; M3.Ma=(double**)malloc(M3.RowNum*sizeof(double*)); for (int p=0;p<M3.ColNum;p++) { M3.Ma[p]=(double*)malloc(M3.ColNum*sizeof(double)); } double sum=0; for (i=0;i<M1.RowNum;i++) { for (k=0;k<M2.ColNum;k++) { for (j=0;j<M2.RowNum;j++) { sum+=M1.Ma[i][j]*M2.Ma[j][k]; } M3.Ma[i][k]=sum; sum=0; } } } return M3; } //主函数 int main() { Matrix M1,M2,M3; M1=CreateMatrix(); ShowMatrix(M1); printf("\n伴随矩阵为:\n"); M2=FollowMatrix(M1); ShowMatrix(M2); printf("\n逆矩阵为:\n"); M3=InverseMatrix(M1); ShowMatrix(M3); return 0; } |