マトリクスのいくつかの操作について(回転マトリクス、行列式、マトリクスのランク、マトリクスの逆マトリクス、2つのマトリクスの積マトリクスを求める)


このプログラムの機能は主にいくつかの簡単なマトリクス計算問題を解決する.
主な機能は次のとおりです.
①マトリクス入力
②マトリックス出力
③出力行列の転置行列(任意の行列を転置可能な行列)
④行列の行列式を求める(もしあなたが誤りを入力するならば、プログラムはあなたの誤りを提示して、あなたはプログラムを閉じることができて、再び行列の同じ行列を入力して、更に計算を行います)
⑤行列のランクを求める
⑥行列の逆行列を求める(前提:行と列が等しい)
⑦2つの行列の積行列を求める(そのうちの1つは入力した行列で、もう1つは自分で入力して、複数回の積を計算することができます)
/*
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("
The OriginalMatrix A is:
"); printf("**********************************************
"); for(i=0;i<am;i++) { for(j=0;j<an;j++) { printf("%10.4f",a[i][j]); } printf("
"); } } 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("
"); } } 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!
"); } 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
",count); } else { printf("**********************************************
"); printf("the rank is %d
",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!
"); } 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!
"); } 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:
"); printf("**********************************************
"); 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:
"); scanf("%d %d",&bm,&bn); if(an!=bm) { printf("error!
"); } else { printf("please input the matrix A:
"); 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:
"); printf("**********************************************
"); for(i=0;i<am;i++) { for(j=0;j<bn;j++) { printf("%10.4lf",d[i][j]); } printf("
"); } } } void main() { int m,n,i,j,select; double a[N][N],detA; printf("please input the row and line of matrix A:
"); scanf("%d %d",&m,&n); printf("please input the matrix A:
"); for(i=0;i<m;i++) { for(j=0;j<n;j++) { scanf("%lf",&a[i][j]); } } do { printf("**********************************************
"); printf("1-->output
2-->inver
3-->get detmination
4->get rank
5-->get nijuzhen
6->get multiply of two matrixs
0-->exit!
"); printf("**********************************************
"); do { printf("Please input your choice:
(Warming:Please input number from 0 to 6,or it will be error!)
"); scanf("%d",&select); if(select>6||select<0) { printf("Error!please input the number again!
"); } }while(select>6||select<0); switch(select) { case 1: output(a,m,n); break; case 2: printf("
The InverseMatrix is:
"); printf("**********************************************
"); inver(a,m,n); break; case 3: detA=getdet(a,m,n); printf("the detmination is %.4lf
",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); }