您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > c语言-n阶方阵求逆
#includestdio.h#includestdlib.h#includemath.h#defineMAX255voidMatrixMul(a,b,m,n,k,c)/*实矩阵相乘*/intm,n,k;/*m:矩阵A的行数,n:矩阵B的行数,k:矩阵B的列数*/doublea[],b[],c[];/*a为A矩阵,b为B矩阵,c为结果,即c=AB*/{inti,j,l,u;/*逐行逐列计算乘积*/for(i=0;i=m-1;i++)for(j=0;j=k-1;j++){u=i*k+j;c[u]=0.0;for(l=0;l=n-1;l++)c[u]=c[u]+a[i*n+l]*b[l*k+j];}return;}intbrinv(a,n)/*求矩阵的逆矩阵*/intn;/*矩阵的阶数*/doublea[];/*矩阵A*/{int*is,*js,i,j,k,l,u,v;doubled,p;is=malloc(n*sizeof(int));js=malloc(n*sizeof(int));for(k=0;k=n-1;k++){d=0.0;for(i=k;i=n-1;i++)/*全选主元,即选取绝对值最大的元素*/for(j=k;j=n-1;j++){l=i*n+j;p=fabs(a[l]);if(pd){d=p;is[k]=i;js[k]=j;}}/*全部为0,此时为奇异矩阵*/if(d+1.0==1.0){free(is);free(js);printf(Thisisasingularmatrix,can'tbeinversed!\n);return(0);}/*行交换*/if(is[k]!=k)for(j=0;j=n-1;j++){u=k*n+j;v=is[k]*n+j;p=a[u];a[u]=a[v];a[v]=p;}/*列交换*/if(js[k]!=k)for(i=0;i=n-1;i++){u=i*n+k;v=i*n+js[k];p=a[u];a[u]=a[v];a[v]=p;}l=k*n+k;a[l]=1.0/a[l];/*求主元的倒数*//*a[kj]a[kk]-a[kj]*/for(j=0;j=n-1;j++)if(j!=k){u=k*n+j;a[u]=a[u]*a[l];}/*a[ij]-a[ik]a[kj]-a[ij]*/for(i=0;i=n-1;i++)if(i!=k)for(j=0;j=n-1;j++)if(j!=k){u=i*n+j;a[u]=a[u]-a[i*n+k]*a[k*n+j];}/*-a[ik]a[kk]-a[ik]*/for(i=0;i=n-1;i++)if(i!=k){u=i*n+k;a[u]=-a[u]*a[l];}}for(k=n-1;k=0;k--){/*恢复列*/if(js[k]!=k)for(j=0;j=n-1;j++){u=k*n+j;v=js[k]*n+j;p=a[u];a[u]=a[v];a[v]=p;}/*恢复行*/if(is[k]!=k)for(i=0;i=n-1;i++){u=i*n+k;v=i*n+is[k];p=a[u];a[u]=a[v];a[v]=p;}}free(is);free(js);return(1);}print_matrix(a,n)/*打印的方阵a的元素*/intn;/*矩阵的阶数*/doublea[];/*矩阵a*/{inti,j;for(i=0;in;i++){for(j=0;jn;j++)printf(%13.7f\t,a[i*n+j]);printf(\n);}}main(){inti,j,n=0;doubleA[MAX],B[MAX],C[MAX];staticdoublea[4][4]={{0.2368,0.2471,0.2568,1.2671},{1.1161,0.1254,0.1397,0.1490},{0.1582,1.1675,0.1768,0.1871},{0.1968,0.2071,1.2168,0.2271}};staticdoubleb[4][4],c[4][4];clrscr();puts(**********************************************************);puts(*ThisprogramistoinverseasquarematrixA(nxn).*);puts(**********************************************************);while(n=0){printf(Pleaseinputtheordernofthematrix(0n182):);scanf(%d,&n);}printf(Pleaseinputtheelementsofthematrixonebyone:\n);for(i=0;in*n;i++){scanf(%lf,&A[i]);B[i]=A[i];}for(i=0;i4;i++)for(j=0;j4;j++)b[i][j]=a[i][j];i=brinv(A,n);if(i!=0){printf(MatrixA:\n);print_matrix(B,n);printf(\n);printf(A'sInverseMatrixA-:\n);print_matrix(A,n);printf(\n);printf(ProductofAandA-:\n);MatrixMul(B,A,n,n,n,C);print_matrix(C,n);}printf(\nPressanykeytoquit...);getch();}
本文标题:c语言-n阶方阵求逆
链接地址:https://www.777doc.com/doc-4642224 .html