- 根据上述内容,为求逆矩阵,需要分别求得矩阵行列式的值和矩阵的逆矩阵.
1 矩阵行列式求值
 
1.1 定义
 
- 由 
      
       
        
        
          n 
         
        
       
         n 
        
       
     n阶方阵 
      
       
        
        
          A 
         
        
       
         A 
        
       
     A的元素构成的行列式(各元素位置不变),称为 
      
       
        
        
          A 
         
        
       
         A 
        
       
     A的行列式,记作 
      
       
        
        
          ∣ 
         
         
          
           
            
            
              A 
             
            
           
          
         
        
          ∣ 
         
        
       
         \begin{vmatrix}A \end{vmatrix} 
        
       
      
              A 
              或 
      
       
        
        
          d 
         
        
          e 
         
        
          t 
         
        
          A 
         
        
       
         detA 
        
       
     detA.
1.2 C++代码
 
 
- 求行列式值的两种途径:一是根据行列式定义、二是利用代数余子式.
- 在CDeterminant类中增加两个成员函数GetCetValByDef()和GetDetValByRem(),相关代码参考【线性代数|行列式定义及其值】和【线性代数 | C++】行列式按行(列)展开。
2 求伴随矩阵
 
2.1 定义
 
- 行列式 
      
       
        
        
          ∣ 
         
         
          
           
            
            
              A 
             
            
           
          
         
        
          ∣ 
         
        
       
         \begin{vmatrix}A\end{vmatrix} 
        
       
      
              A 
              各元素的代数余子式 
      
       
        
         
         
           A 
          
          
          
            i 
           
          
            j 
           
          
         
        
       
         A_{ij} 
        
       
     Aij构成的如下矩阵 
       
        
         
          
          
            A 
           
          
            ∗ 
           
          
         
           = 
          
          
          
            [ 
           
           
            
             
              
               
               
                 A 
                
               
                 11 
                
               
              
             
             
              
               
               
                 A 
                
               
                 21 
                
               
              
             
             
              
              
                ⋯ 
               
              
             
             
              
               
               
                 A 
                
                
                
                  n 
                 
                
                  1 
                 
                
               
              
             
            
            
             
              
               
               
                 A 
                
               
                 12 
                
               
              
             
             
              
               
               
                 A 
                
               
                 22 
                
               
              
             
             
              
              
                ⋯ 
               
              
             
             
              
               
               
                 A 
                
                
                
                  n 
                 
                
                  2 
                 
                
               
              
             
            
            
             
              
               
               
                 ⋮ 
                
                
                 
                
               
              
             
             
              
               
               
                 ⋮ 
                
                
                 
                
               
              
             
             
              
               
              
             
             
              
               
               
                 ⋮ 
                
                
                 
                
               
              
             
            
            
             
              
               
               
                 A 
                
                
                
                  1 
                 
                
                  n 
                 
                
               
              
             
             
              
               
               
                 A 
                
                
                
                  2 
                 
                
                  n 
                 
                
               
              
             
             
              
              
                ⋯ 
               
              
             
             
              
               
               
                 A 
                
                
                
                  n 
                 
                
                  n 
                 
                
               
              
             
            
           
          
            ] 
           
          
         
           , 
          
         
        
          A^*=\begin{bmatrix}A_{11} & A_{21} & \cdots & A_{n1} \\A_{12} & A_{22} & \cdots & A_{n2} \\ \vdots & \vdots && \vdots \\A_{1n} & A_{2n} &\cdots & A_{nn}\end{bmatrix}, 
         
        
      A∗= 
               A11A12⋮A1nA21A22⋮A2n⋯⋯⋯An1An2⋮Ann 
               ,称为矩阵 
      
       
        
        
          A 
         
        
       
         A 
        
       
     A的伴随矩阵.
- 注意:伴随矩阵 
      
       
        
         
         
           A 
          
         
           ∗ 
          
         
        
       
         A^* 
        
       
     A∗中元素的位置与对应行列式 
      
       
        
        
          ∣ 
         
         
          
           
            
            
              A 
             
            
           
          
         
        
          ∣ 
         
        
       
         \begin{vmatrix}A\end{vmatrix} 
        
       
      
              A 
              中元素的位置呈转置关系.
2.2 C++代码
 
2.2.1 求余子式
 
- 由定义可知,求伴随矩阵,需先求行列式各元素的代数余子式.
- 求代数余子式,需先求余子式.
- 故,在CDeterminant类中增加一个求行列式余子式的成员函数GetDetRem().
static bool GetDetRem
(
    const vector<vector<double>> &vvDetInput, 
    int i,  
    int j,  
    vector<vector<double>> &vvDetRet    
);
 
bool CDeterminant::GetDetRem
(
    const vector<vector<double>> &vvDetInput, 
    int i, 
    int j,
    vector<vector<double>> &vvDetRet
)
{
    if (false == IsDet(vvDetInput))
        return false;
    vvDetRet.clear();
    vvDetRet = vvDetInput;
    
    vvDetRet.erase(vvDetRet.cbegin() + i);
    for (int i = 0; i < vvDetRet.size(); i++)
    {
        
        vvDetRet[i].erase(vvDetRet[i].cbegin() + j);
    }
    
    return true;
}
 
2.2.2 求伴随矩阵
 
- 在CMatrix类中添加GetAdjointMat函数,用于求伴随矩阵.其思路是: 
  - 按列逐行取得矩阵的元素;
- 求相应的余子式
- 对余子式求值
- 求代数余子式
- 将代数余子式的值,按行填入新矩阵
- 得到伴随矩阵
 
static bool GetAdjointMat
(
const vector<vector<double>> &vvMatInput,
vector<vector<double>> &vvMatRet
);
 
bool CMatrix::GetAdjointMat
(
  const vector<vector<double>> &vvMatInput,
  vector<vector<double>> &vvMatRet
)
{
  
  if (false == CDeterminant::IsDet(vvMatInput))
    return false;
  
  vvMatRet.clear();
  vector<double> vTemp;
  vector<vector<double>> vvDetTemp;
  double iDetValTemp;
  
  for (int i = 0; i < vvMatInput[0].size(); i++)
  {
    vTemp.clear();
    
    for (int j = 0; j < vvMatInput.size(); j++)
    {
      
      vvDetTemp.clear();
      CDeterminant::GetDetRem(vvMatInput, j, i, vvDetTemp);
      
      iDetValTemp = 0;
      CDeterminant::GetDetValByDef(vvDetTemp, iDetValTemp);
      
      iDetValTemp = (pow(-1, i + j) * iDetValTemp);
      
      vTemp.push_back(iDetValTemp);
    }  
    
    vvMatRet.push_back(vTemp);  
  }  
  
  return true;
}
 
3 求逆矩阵
 
- 利用前面求得的 
      
       
        
        
          ∣ 
         
         
          
           
            
            
              A 
             
            
           
          
         
        
          ∣ 
         
        
       
         \begin{vmatrix}A \end{vmatrix} 
        
       
      
              A 
              及 
      
       
        
         
         
           A 
          
         
           ∗ 
          
         
        
       
         A^* 
        
       
     A∗,按照公式 
      
       
        
         
         
           A 
          
          
          
            − 
           
          
            1 
           
          
         
        
          = 
         
         
         
           1 
          
          
          
            ∣ 
           
           
            
             
              
              
                A 
               
              
             
            
           
          
            ∣ 
           
          
         
         
         
           A 
          
         
           ∗ 
          
         
        
       
         A^{-1}= \frac{1}{\begin{vmatrix}A \end{vmatrix}}A^* 
        
       
     A−1=∣A∣1A∗,可以求得 
      
       
        
        
          A 
         
        
       
         A 
        
       
     A的逆矩阵.
- 在CMatrix类中增加GetInverseMat函数,以实现上述功能.
static bool GetInverseMat
(
const vector<vector<double>> &vvMatInput,
vector<vector<double>> &vvInverseMat
);
 
bool CMatrix::GetInverseMat
(
  const vector<vector<double>> &vvMatInput,
  vector<vector<double>> &vvInverseMat
)
{
  if (false == CDeterminant::IsDet(vvMatInput))
    return false;
  
  double fDetVal;
  CDeterminant::GetDetValByDef(vvMatInput, fDetVal);
  if (0 == fDetVal)
    return false;  
  fDetVal = 1.0 / fDetVal;
  vector<vector<double>> vvMatTemp;
  GetAdjointMat(vvMatInput, vvMatTemp);
  vvInverseMat.clear();
  MatMulti(fDetVal, vvMatTemp, vvInverseMat);
  return true;
}
 
4 测试
 
#include <iostream>
#include <iomanip>
#include <vector>
#include "CMatrix.h"
using namespace std;
bool PrintMat
(
  const vector<vector<double>> &vvMat
)
{
  for (int i = 0; i < vvMat.size(); i++)
  {
    for (int j = 0; j < vvMat[i].size(); j++)
    {
      cout << setw(5) << vvMat[i][j];
    }
    cout << endl;
  }
  
  return true;
}
int main()
{
  vector<vector<double>> vvMatA{{ 1, 2, 3},
                                { 2, 2, 1},
                                { 3, 4, 3}};
  
  vector<vector<double>> vvMatRet;
  if (false == CMatrix::GetInverseMat(vvMatA, vvMatRet))
  {
    cout << "计算失败" << endl;
  }
  else
  {
    PrintMat(vvMatRet);
  } 
  return 0;
}
 

 
 
- 引用文献:《工程数学 线性代数(第五版)》同济大学数学系编,高等教育出版社.
- 以上为个人学习、练习的记录,如有错误,欢迎指正.