该程序的功能主要解决一些简单矩阵计算问题。
主要功能有:
① 矩阵输入
② 矩阵输出
③ 输出矩阵的转置矩阵(可转置任意行列的矩阵)
④ 求方阵的行列式(如果你输入错误,程序将提示你错误,你可关闭程序,重新输入行列相同的矩阵,再进行计算)
⑤ 求矩阵的秩
⑥ 求矩阵的逆矩阵(前提:行和列相等)
⑦ 求两个矩阵的乘积矩阵(其中之一是你已经输入的那一个矩阵,另一个你可自行输入,可计算多次乘积)
- /*
- author:wangchangshuai0010 sdust wangchangshuai0010.iteye.com
- */
- #include<stdio.h>
- #include<math.h>
- #define N 10
- void output(double a[][N],int am,int an)
- {
- int i,j;
- printf("\nThe OriginalMatrix A is:\n");
- printf("**********************************************\n");
- for(i=0;i<am;i++)
- {
- for(j=0;j<an;j++)
- {
- printf("%10.4f",a[i][j]);
- }
- printf("\n");
- }
- }
- void inver(double b[][N],int am,int an)
- {
- int i,j;
- double a[N][N],c[N][N];
- for(i=0;i<am;i++)
- {
- for(j=0;j<an;j++)
- {
- a[i][j]=b[i][j];
- }
- }
- for(i=0;i<am;i++)
- {
- for(j=0;j<an;j++)
- {
- c[j][i]=a[i][j];
- }
- }
- for(i=0;i<an;i++)
- {
- for(j=0;j<am;j++)
- {
- printf("%10.4f",c[i][j]);
- }
- printf("\n");
- }
- }
- double getdet(double b[][N],int am,int an)
- {
- int i,j,k,l,nexti,count=0;
- double temp,a[N][N],detA=1.0,x;
- for(i=0;i<am;i++)
- {
- for(j=0;j<an;j++)
- {
- a[i][j]=b[i][j];
- }
- }
- if(am==an)
- {
- for(i=0,j=0;i<am-1;i++,j++)
- {
- nexti=i;
- while(a[i][j]==0)
- {
- nexti++;
- temp=a[i][j];
- a[i][j]=a[nexti][j];
- a[nexti][j]=temp;
- }
- for(k=j+1;k<am;k++)
- {
- temp=a[i][k];
- a[i][k]=a[nexti][k];
- a[nexti][k]=temp;
- }
- for(l=i+1;l<an;l++)
- {
- if(a[l][j]==0)
- {l++;}
- else
- {
- x=a[l][j]/a[i][j];
- for(k=j;k<am;k++)
- {
- a[l][k]=a[l][k]-(x)*a[i][k];
- }
- }
- }
- }
- for(i=0,j=0;i<am;i++,j++)
- {
- detA*=a[i][j];
- }
- }
- else
- {
- printf("error!\n");
- }
- return detA;
- }
- void getrank(double b[][N],int am,int an)
- {
- int i,s,j,k,l,nexti,t=0,count=0;
- double temp,x,a[N][N],detA=1.0;
- if(am>an)
- {
- s=am;
- am=an;
- an=s;
- }
- for(i=0;i<am;i++)
- {
- for(j=0;j<an;j++)
- {
- a[i][j]=b[i][j];
- }
- }
- for(i=0,j=0;i<am-1;i++,j++)
- {
- nexti=i;
- while(a[i][j]==0)
- {
- nexti=i+1;
- temp=a[i][j];
- a[i][j]=a[nexti][j];
- a[nexti][j]=temp;
- }
- for(k=j+1;k<am;k++)
- {
- temp=a[i][k];
- a[i][k]=a[nexti][k];
- a[nexti][k]=temp;
- }
- for(l=i+1;l<an;l++)
- {
- if(a[l][j]==0)
- {l++;}
- else
- {
- x=a[l][j]/a[i][j];
- for(k=j;k<am;k++)
- {
- a[l][k]=a[l][k]-(x)*a[i][k];
- }
- }
- }
- }
- for(i=an-1;i<an;i++)
- {
- for(j=am;j<an;j++)
- {
- if(a[i][j]!=0)
- {
- t++;
- }
- }
- }
- if(t==0)
- {
- for(i=0,j=0;a[i][j]!=0&&i<an;i++,j++)
- {count++;}
- printf("the rank is %d\n",count);
- }
- else
- {
- printf("**********************************************\n");
- printf("the rank is %d\n",am);
- }
- }
- void getnijuzhen(double b[][N],int am,int an)
- {
- int i,j,k,l,m,n;
- double a[N][N],c[N][N],d[N][N],x;
- if(an!=am)
- {
- printf("error!\n");
- }
- else{
- for(i=0;i<am;i++)
- {
- for(j=0;j<an;j++)
- {
- a[i][j]=b[i][j];
- }
- }
- for(i=0;i<am;i++)
- {
- for(j=0;j<an;j++)
- {
- m=i;
- n=j;
- for(k=0,m=0;k<am-1;k++,m++)
- {
- if(k==m)
- {m++;}
- for(l=0,n=0;l<am-1;l++,n++)
- {
- if(l==j)
- {n++;}
- c[k][l]=a[m][n];
- }
- }
- d[i][j]=getdet(c,an-1,an-1)*pow(-1,i+j);
- }
- }
- x=getdet(a,an,am);
- if(x==0)
- {
- printf("error!can't get nijuzhen!\n");
- }
- else
- {
- for(i=0;i<am;i++)
- {
- for(j=0;j<an;j++)
- {
- d[i][j]=d[i][j]/x;
- }
- }
- printf("the nijuzhen of the matrix is:\n");
- printf("**********************************************\n");
- inver(d,an,an);
- }
- }
- }
- void multiply(double c[N][N],int am,int an)
- {
- int i,j,k,bm,bn;
- double a[N][N],b[N][N],d[N][N];
- printf("please input the row and line of matrix B:\n");
- scanf("%d %d",&bm,&bn);
- if(an!=bm)
- {
- printf("error!\n");
- }
- else
- {
- printf("please input the matrix A:\n");
- for(i=0;i<bm;i++)
- {
- for(j=0;j<bn;j++)
- {
- scanf("%lf",&b[i][j]);
- }
- }
- for(i=0;i<am;i++)
- {
- for(j=0;j<an;j++)
- {
- a[i][j]=c[i][j];
- }
- }
- for(i=0;i<am;i++)
- {
- for(j=0;j<bn;j++)
- {
- d[i][j]=0;
- for(k=0;k<bn;k++)
- d[i][j]+=a[i][k]*b[k][j];
- }
- }
- printf("the multiply of A and B is:\n");
- printf("**********************************************\n");
- for(i=0;i<am;i++)
- {
- for(j=0;j<bn;j++)
- {
- printf("%10.4lf",d[i][j]);
- }
- printf("\n");
- }
- }
- }
- void main()
- {
- int m,n,i,j,select;
- double a[N][N],detA;
- printf("please input the row and line of matrix A:\n");
- scanf("%d %d",&m,&n);
- printf("please input the matrix A:\n");
- for(i=0;i<m;i++)
- {
- for(j=0;j<n;j++)
- {
- scanf("%lf",&a[i][j]);
- }
- }
- do
- {
- printf("**********************************************\n");
- printf("1-->output\n2-->inver\n3-->get detmination\n4->get rank\n5-->get nijuzhen\n6->get multiply of two matrixs\n0-->exit!\n");
- printf("**********************************************\n");
- do
- {
- printf("Please input your choice:\n(Warming:Please input number from 0 to 6,or it will be error!)\n");
- scanf("%d",&select);
- if(select>6||select<0)
- {
- printf("Error!please input the number again!\n");
- }
- }while(select>6||select<0);
- switch(select)
- {
- case 1:
- output(a,m,n);
- break;
- case 2:
- printf("\nThe InverseMatrix is:\n");
- printf("**********************************************\n");
- inver(a,m,n);
- break;
- case 3:
- detA=getdet(a,m,n);
- printf("the detmination is %.4lf\n",detA);
- break;
- case 4:
- getrank(a,m,n);
- break;
- case 5:
- getnijuzhen(a,m,n);
- break;
- case 6:
- multiply(a,m,n);
- default:
- break;
- }
- }while(select!=0);
- }