矩陣求逆算法及程序實現(C++)
在做課題時,遇到了求多項式問題,利用了求逆方法。矩陣求逆一般使用簡單的算法,還有快速算法 如全選主元高斯-約旦消元法,但本文程序主要寫了簡單的矩陣求逆算法定義法之伴隨矩陣求逆公式如下,其中A可逆:
A^{-1}=\frac{A^*}{|A|},其中A^*是A的伴隨矩陣。。
1.給定一個方陣,非奇異(不是也可,程序有考慮);
2.由矩陣得到其行列式,求其值如|A|;
3.求其伴隨矩陣A^*;
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 }
復制代碼
這三個函數組成了求逆矩陣的步驟,筆者調用並成功運用,無錯,在此共勉。如有問題,請留言。謝謝
另有其他矩陣求逆好算法及代碼請大家共享。