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

降階法計算行列式 C# 實現:Bug 修正與優化

     編輯:關於C++

背景

遞歸降階法(拉普拉斯展開)計算行列式,原代碼在隨機展開行時索引越界,已修正。

修正點

隨機選取展開行 `i`(1-based),迴圈列 `j` 1..n,訪問矩陣元素應為 `Determinants[i-1, j-1]`(0-based),原代碼誤用 `Determinants[i, j]` 導致越界。

完整修正代碼

public static decimal CalcDeterminantAij(decimal[,] Determinants, bool ZeroOptimization = false) {
    int n = Determinants.GetLength(0);
    if (n == 2) return Determinants[0,0]*Determinants[1,1] - Determinants[0,1]*Determinants[1,0];
    if (n == 1) return Determinants[0,0];
    if (n == 0) throw new Exception("參數錯誤!");

    if (ZeroOptimization) {
        // 找 0 最多的行/列展開(略,同原邏輯)
    } else {
        int i = new Random().Next(1, n+1); // 1-based
        decimal sum = 0;
        for (int j = 1; j <= n; ++j) {
            var sign = CalcDeterMijSign(i, j);
            var minor = GetDeterminantMij(Determinants, i, j);
            sum += sign * Determinants[i-1, j-1] * CalcDeterminantAij(minor, ZeroOptimization); // 修正索引
        }
        return sum;
    }
}

優化建議

  • 基礎情況 n≤3 直接公式計算,避免遞歸開銷。
  • 零優化策略:優先展開 0 元素最多的行/列,大幅減少遞歸分支。
  • 大矩陣(n>10)建議改用 LU 分解 O(n³),遞歸降階 O(n!) 僅適合教學/小矩陣。

總結

修正索引越界 Bug 後,代碼可正確計算任意階行列式。結合零優化與隨機展開,兼顧正確性與一定效率,適合教學演示與小規模計算。

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