说明1、该程序模拟初等变换法求逆矩阵的过程,但效率并不是最优的,仅供参考。2、运行之前,请修改宏定义M和N的值,使之和增广矩阵(aE)的行数以及列数匹配。3、推荐一个在线求逆矩阵的网站(应用数学家园),网站地址:代码/*初等变换法求逆矩阵C++实现byLDSD2015/10/30*/#includeiostreamusingnamespacestd;#defineN8//定义为增广后矩阵的列数,实际上,N=2*M#defineM4//定义为该矩阵的行数voidprint(floata[][N],intstart)//每行从start的位置输出{cout—————————————————————————————endl;for(inti=0;iM;i++){for(intj=start;jN;j++){couta[i][j]'\t';}coutendl;}cout—————————————————————————————endl;}voidexchange(floata[][N],inthan1,inthan2){floattmp;cout\n\n交换第han1行和第han2行,结果为:\n;for(inti=0;iN;i++){tmp=a[han1][i];a[han1][i]=a[han2][i];a[han2][i]=tmp;}}intcompare(floata[],floatb[],intdirection)/*10230245如果第一行大于第二行,返回-1,进行交换否则(第一行等于或小于第二行)如果direction为1返回第一个可以做运算的位置,这里是2如果direction为0返回-2,从而程序直接跳过去*/{intj=0;inta_local=0,b_local=0;for(j=0;jN;j++){if(a[j]!=0){a_local=j;break;}}for(j=0;jN;j++){if(b[j]!=0){b_local=j;break;}}if(a_local==N||b_local==N)returnN;elseif((a_localb_local)&&direction==0)return-1;elseif((a_local==b_local)&&direction==0)returnb_local;elseif((a_localb_local)&&direction==0)return-2;elseif((a_localb_local)&&direction==1)return-1;elseif((a_local=b_local)&&direction==1)returna_local;}intdeal(floata[][N],inthan1,inthan2,intdirection){//返回的flag为1,则调用print函数intflag=0;inti=0,local=0;floatsave1,save2,div_factor;local=compare(a[han1],a[han2],direction);if(local==N/2)cout这个矩阵行列式为0,不存在逆矩阵endl;elseif(local==-1){exchange(a,han1,han2);flag=1;}elseif(a[han1][local]!=0&&local!=-2){save1=a[han2][local];save2=a[han1][local];div_factor=a[han2][local]/a[han1][local];for(intk=0;kN;k++){a[han2][k]=a[han2][k]-a[han1][k]*save1/save2;}cout\n\n第1+han2行减去save1/save2乘以第1+han1行,结果为:endl;flag=1;}returnflag;}voidgenerator(floata[][N]){for(inti=0;iM;i++)a[i][M+i]=1;}intreverse(floata[][N]){intflag=0;generator(a);//把一个单位矩阵补加到矩阵后面for(inti=0;iM-1;i++){for(intj=i;jM-1;j++){flag=deal(a,i,j+1,0);if(flag==1)print(a,0);elseif(flag==2)return0;}}for(intk=0;kM-1;k++)for(intm=k;mM-1;m++){flag=deal(a,m+1,k,1);if(flag==1)print(a,0);elseif(flag==2)return0;}}voidunit(floata[][N]){for(intj=0;jM;j++){for(inti=N/2;iN;i++){a[j][i]=a[j][i]/a[j][j];}a[j][j]=1;}}voidmain(){//floata[M][N]={{4,-1,-3},{-6,2,3},{-5,1,5}};floata[M][N]={{1,1,2,0},{-3,-3,-5,1},{0,-1,-3,-1},{0,0,-1,0}};//floata[M][N]={{1,0,0},{0,1,0},{0,0,1}};//floata[M][N]={{1,1,3},{0,3,4},{8,4,6}};reverse(a);//此函数得到的结果还没有单位化unit(a);//对矩阵进行单位化cout即该矩阵的逆矩阵如下:endl;print(a,N/2);}示例