我正在寫一個矩陣庫,當我測驗時the determinant of the matrix,我發現了這個錯誤
我很少用templates,找不到錯誤原因
template<int n>
struct Vec{
double data[n]{0};
Vec() = default;
explicit Vec(int value) { ... }
};
template<int row, int col>
struct Mat{
Vec<col> data[row];
explicit Mat() { ... }
Mat(std::initializer_list<double> list) { ... }
Mat<row - 1, col - 1> Minor(const int x, const int y) const{
Mat<row - 1, col - 1> ret;
...
return ret;
}
double Cofactor(const int x, const int y) const{
return Minor(x, y).Det() * ((x y) % 2 ? -1 : 1);
}
double Det() const{
assert(row == col);
if(row == 1 && col == 1) return data[0][0];
double ret = 0;
for(int i = 0; i < col; i){
ret = data[0][i] * Cofactor(0, i);
}
return ret;
}
};
無法呼叫 Det
Mat<3, 3> matrix{2, 6, 3,
1, 0, 2,
5, 8, 4};
std::cout << matrix.Det() << std::endl;
錯誤資訊如下

uj5u.com熱心網友回復:
如果您的編譯器至少支持 C 17,那么解決方案是使用if constexpr:
double Det() const{
static_assert(row == col);
if constexpr(row == 1 && col == 1) return data[0][0];
else
{
double ret = 0;
for(int i = 0; i < col; i){
ret = data[0][i] * Cofactor(0, I);
}
return ret;
}
}
這是它的 C 方面。從演算法的角度來看,按照定義計算行列式(即使用 Kronecker 方法),正如您所做的那樣,會導致作為矩陣大小函式的指數復雜性。存在的演算法只是矩陣大小的立方體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/346197.html
上一篇:C 我應該使用轉發參考嗎?
