遞歸降階法(拉普拉斯展開)計算行列式,原代碼在隨機展開行時索引越界,已修正。
隨機選取展開行 `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;
}
}
修正索引越界 Bug 後,代碼可正確計算任意階行列式。結合零優化與隨機展開,兼顧正確性與一定效率,適合教學演示與小規模計算。