對於可逆方陣 \( A \),其逆矩陣公式為:
\[ A^{-1} = \frac{A^*}{|A|} \]
其中 \( |A| \) 為行列式,\( A^* \) 為伴隨矩陣(代數餘子式矩陣的轉置)。步驟:
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;
}
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]; // 代數餘子式符號
}
}
}
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;
}
本文給出了伴隨矩陣法求逆的完整 C++ 實現,代碼結構清晰,適合理解「行列式、餘子式、伴隨矩陣」之間的聯繫。但需注意其指數級複雜度,實際項目中應優先選用數值穩定的高斯消元或成熟線性代數庫(如 Eigen)。