首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 矩陣求逆:伴隨矩陣法完整實現與代碼解析

     編輯:C++ 入門

算法原理

對於可逆方陣 \( A \),其逆矩陣公式為:

\[ A^{-1} = \frac{A^*}{|A|} \]

其中 \( |A| \) 為行列式,\( A^* \) 為伴隨矩陣(代數餘子式矩陣的轉置)。步驟:

  1. 計算行列式 \( |A| \),若為 0 則不可逆。
  2. 求每個元素的代數餘子式,構成伴隨矩陣 \( A^* \)。
  3. 將 \( A^* \) 每個元素除以 \( |A| \) 得到逆矩陣。

關鍵函數實現

1. 行列式遞歸計算(按第一行展開)

double getA(double arcs[N][N], int n) {
    if (n == 1) return arcs[0][0];
    double ans = 0, temp[N][N];
    for (int i = 0; i < n; i++) {
        // 構造餘子式矩陣 temp
        for (int j = 0; j < n-1; j++)
            for (int k = 0; k < n-1; k++)
                temp[j][k] = arcs[j+1][(k >= i) ? k+1 : k];
        double t = getA(temp, n-1);
        ans += (i % 2 == 0) ? arcs[0][i] * t : -arcs[0][i] * t;
    }
    return ans;
}

2. 伴隨矩陣構造

void getAStart(double arcs[N][N], int n, double ans[N][N]) {
    if (n == 1) { ans[0][0] = 1; return; }
    double temp[N][N];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            // 構造去掉第 i 行、第 j 列的餘子式
            for (int k = 0; k < n-1; k++)
                for (int t = 0; t < n-1; t++)
                    temp[k][t] = arcs[k >= i ? k+1 : k][t >= j ? t+1 : t];
            ans[j][i] = getA(temp, n-1); // 注意轉置:ans[j][i]
            if ((i + j) % 2) ans[j][i] = -ans[j][i]; // 代數餘子式符號
        }
    }
}

3. 逆矩陣主函數

bool GetMatrixInverse(double src[N][N], int n, double des[N][N]) {
    double det = getA(src, n);
    if (det == 0) return false;
    double adj[N][N];
    getAStart(src, n, adj);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            des[i][j] = adj[i][j] / det;
    return true;
}

複雜度與適用場景

  • 行列式遞歸:\( O(n!) \),極慢,僅適合 \( n \le 10 \) 的教學/小規模矩陣。
  • 工程實際建議用 高斯-約旦消元法(\( O(n^3) \))或 LU 分解。

總結

本文給出了伴隨矩陣法求逆的完整 C++ 實現,代碼結構清晰,適合理解「行列式、餘子式、伴隨矩陣」之間的聯繫。但需注意其指數級複雜度,實際項目中應優先選用數值穩定的高斯消元或成熟線性代數庫(如 Eigen)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved