在做課題時,遇到了求多項式問題,利用了求逆方法。矩陣求逆一般使用簡單的算法,還有快速算法 如全選主元高斯-約旦消元法,但本文程序主要寫了簡單的矩陣求逆算法定義法之伴隨矩陣求逆公式如下,其中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 }
這三個函數組成了求逆矩陣的步驟,筆者調用並成功運用,無錯,在此共勉。如有問題,請留言。謝謝
另有其他矩陣求逆好算法及代碼請大家共享。
