在做课题时,遇到了求多项式问题,利用了求逆方法。矩阵求逆一般使用简单的算法,还有快速算法 如全选主元高斯-约旦消元法,但本文程序主要写了简单的矩阵求逆算法定义法之伴随矩阵求逆公式如下,其中A可逆:
,其中是的伴随矩阵。。
1.给定一个方阵,非奇异(不是也可,程序有考虑);
2.由矩阵得到其行列式,求其值如|A|;
3.求其伴随矩阵;
4.得到其逆矩阵。
主要函数如下:
1 //得到给定矩阵src的逆矩阵保存到des中。 2 bool GetMatrixInverse(double src[N][N],int n,double des[N][N]) 3 { 4 double flag=getA(src,n); 5 double t[N][N]; 6 if(flag==0) 7 { 8 return false; 9 } 10 else 11 { 12 getAStart(src,n,t); 13 for(int i=0;i<n;i++) 14 { 15 for(int j=0;j<n;j++) 16 { 17 des[i][j]=t[i][j]/flag; 18 } 19 20 } 21 } 22 23 24 return true; 25 26 }
计算|A|:
1 //按第一行展开计算|A| 2 double getA(double arcs[N][N],int n) 3 { 4 if(n==1) 5 { 6 return arcs[0][0]; 7 } 8 double ans = 0; 9 double temp[N][N]={0.0}; 10 int i,j,k; 11 for(i=0;i<n;i++) 12 { 13 for(j=0;j<n-1;j++) 14 { 15 for(k=0;k<n-1;k++) 16 { 17 temp[j][k] = arcs[j+1][(k>=i)?k+1:k]; 18 19 } 20 } 21 double t = getA(temp,n-1); 22 if(i%2==0) 23 { 24 ans += arcs[0][i]*t; 25 } 26 else 27 { 28 ans -= arcs[0][i]*t; 29 } 30 } 31 return ans; 32 }
计算伴随矩阵:
1 //计算每一行每一列的每个元素所对应的余子式,组成A* 2 void getAStart(double arcs[N][N],int n,double ans[N][N]) 3 { 4 if(n==1) 5 { 6 ans[0][0] = 1; 7 return; 8 } 9 int i,j,k,t; 10 double temp[N][N]; 11 for(i=0;i<n;i++) 12 { 13 for(j=0;j<n;j++) 14 { 15 for(k=0;k<n-1;k++) 16 { 17 for(t=0;t<n-1;t++) 18 { 19 temp[k][t] = arcs[k>=i?k+1:k][t>=j?t+1:t]; 20 } 21 } 22 23 24 ans[j][i] = getA(temp,n-1); 25 if((i+j)%2 == 1) 26 { 27 ans[j][i] = - ans[j][i]; 28 } 29 } 30 } 31 }
这三个函数组成了求逆矩阵的步骤,笔者调用并成功运用,无错,在此共勉。如有问题,请留言。谢谢
另有其他矩阵求逆好算法及代码请大家共享。