如何用c++编程求矩阵的逆
蜜私特 RIGHT
2024-05-31 03:09:44
最佳回答
#definen5/*[注]:修改6为你所要的矩阵阶数*/#include"stdio.h"#include"conio.h"/*js()函数用于计算行列式,通过递归算法实现*/intjs(s,n)ints[][n],n;{intz,j,k,r,total=0;intb[n][n];/*b[n][n]用于存放,在矩阵s[n][n]中元素s[0]的余子式*/if(n>2){for(z=0;z<n;z++){for(j=0;j<n-1;j++)for(k=0;k<n-1;k++)if(k>=z)b[j][k]=s[j+1][k+1];elseb[j][k]=s[j+1][k];if(z%2==0)r=s[0][z]*js(b,n-1);/*递归调用*/elser=(-1)*s[0][z]*js(b,n-1);total=total+r;}}elseif(n==2)total=s[0][0]*s[1][1]-s[0][1]*s[1][0];returntotal;}/*n_1()函数用于求原矩阵各元素对应的余子式,存放在数组b[n][n]中,定义为float型*/voidn_1(s,b,n)ints[][n],n;floatb[][n];{intz,j,k,l,m,g,a[n][n];for(z=0;z<n;z++){l=z;for(j=0;j<n;j++){m=j;for(k=0;k<n-1;k++)for(g=0;g<n-1;g++){if(g>=m&&k<l)a[k][g]=s[k][g+1];elseif(k>=l&&g<m)a[k][g]=s[k+1][g];elseif(k>=l&&g>=m)a[k][g]=s[k+1][g+1];elsea[k][g]=s[k][g];}b[z][j]=js(a,n-1);}}}main(){inta[n][n];floatb[n][n];intr,z,j;floattemp;//clrscr();printf("inputoriginaldata:\n");for(z=0;z<n;z++)/*输入所需要的数据,为整型数据*/for(j=0;j<n;j++)scanf("%d",&a[z][j]);printf("\npressentercontinue......");getchar();//gotoxy(1,1);printf("theoriginalmatrix**:\n");for(z=0;z<n;z++)/*打印原矩阵*/{for(j=0;j<n;j++)printf("%5d",a[z][j]);printf("\n");}r=js(a,n);/*调用js()函数计算原矩阵的行列式值*/printf("\ntheoriginalmatrixhanglieshi**:|a|==%d\n",r);if(r==0)printf("because|a|==0,theoriginalmatrixh**enonijuzhen!");/*判断条件:若|a|==0,则原矩阵无逆矩阵,反之则存在逆矩阵*/else{n_1(a,b,n);/*调用n_1()函数,得到原矩阵各元素对应的"余子式",存放在数组b[n][n]中*/for(z=0;z<n;z++)/*求代数余子式,此时b[n][n]中存放的为原矩阵各元素对应的"代数余子式"*/for(j=0;j<n;j++)if((z+j)%2!=0&&b[z][j]!=0)b[z][j]=-b[z][j];for(z=0;z<n;z++)/*对b[n][n]转置,此时b[n][n]中存放的为原矩阵的伴随矩阵*/for(j=z+2;j<n;j++){temp=b[z][j];b[z][j]=b[j][z];b[j][z]=temp;}printf("because|a|!=0,theoriginalmatrixh**enijuzhen!\n");printf("thebansuijuzhena***:\n");for(z=0;z<n;z++)/*打印伴随矩阵a**/{for(j=0;j<n;j++)printf("%4.0f\t",b[z][j]);printf("\n");}for(z=0;z<n;z++)/*求逆矩阵,此时b[n][n]中存放的是原矩阵的逆矩阵*/for(j=0;j<n;j++)b[z][j]=b[z][j]/r;printf("\nthenijuzhen**:(a*)/|a|(|a|=%d)\n",r);/*打印逆矩阵*/for(z=0;z<n;z++){for(j=0;j<n;j++)printf("%8.3f",b[z][j]);printf("\n");}}} 20210311