Я нашел функцию, которая вычисляет определитель матрицы boost::ublas:
template<typename ValType>
ValType det_fast(const ublas::matrix<ValType>& matrix)
{
// create a working copy of the input
ublas::matrix<ValType> mLu(matrix);
ublas::permutation_matrix<std::size_t> pivots(matrix.size1());
auto isSingular = ublas::lu_factorize(mLu, pivots);
if (isSingular)
return static_cast<ValType>(0);
ValType det = static_cast<ValType>(1);
for (std::size_t i = 0; i < pivots.size(); ++i)
{
if (pivots(i) != i)
det *= static_cast<ValType>(-1);
det *= mLu(i, i);
}
return det;
}
Эта функция отлично работает, но только с нецелочисленными типами (отлично работает с float и double). Когда я пытаюсь передать ту же матрицу, но с типом int, я получаю ошибку компиляции:
Ошибка проверки в файле c:\boost\boost
58_0\boost\numeric\ublas\lu.hpp в строке 167: единственное число != 0 || detail::expression_type_check (prod (triangular_adaptor (m), triangular_adaptor (m)), cm) неизвестное местоположение (0): фатальная ошибка в «BaseTest»: std::logic_error: внутренняя логикаtemplate<typename ValType> ValType det_fast(const ublas::matrix<ValType>& matrix) { // create a working copy of the input ublas::matrix<ValType> mLu(matrix); ublas::permutation_matrix<std::size_t> pivots(matrix.size1()); auto isSingular = ublas::lu_factorize(mLu, pivots); if (isSingular) return static_cast<ValType>(0); ValType det = static_cast<ValType>(1); for (std::size_t i = 0; i < pivots.size(); ++i) { if (pivots(i) != i) det *= static_cast<ValType>(-1); det *= mLu(i, i); } return det; }
Это баг буста или у меня неправильная функция? Какие изменения я мог бы сделать, чтобы избежать этой ошибки?