矩陣求逆算法及程序實現(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 }

  這三個函數組成了求逆矩陣的步驟,筆者調用並成功運用,無錯,在此共勉。如有問題,請留言。謝謝

  另有其他矩陣求逆好算法及代碼請大家共享。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM