Многомерный нормальный PDF для использования в Ceres с использованием Eigen

Я пытаюсь написать шаблонный метод, который вычисляет плотность вероятности данного входа для многомерного нормального распределения. Он принимает как вход, средний вектор и ковариационную матрицу в качестве входных данных.

Я хочу использовать этот метод в функторе стоимости Ceres, где фиксированная входная переменная и среднее значение / ковариация. В настоящее время метод выглядит следующим образом:

template <int Dim, class Scalar>
Scalar mvn_norm_pdf(const Eigen::Matrix<Scalar, Dim, 1>   & input,
const Eigen::Matrix<float,  Dim, 1>   & mean,
const Eigen::Matrix<float,  Dim, Dim> & covariance)
{
static const Scalar log_sqrt_2_pi = Scalar(0.5 * std::log(2 * M_PI));

typedef Eigen::LLT<Eigen::Matrix<Scalar, Dim, Dim>> Cholesky;
Cholesky chol(covariance.template cast<Scalar>());
if (chol.info() != Eigen::Success) throw "Decomposition failed!";
const typename Cholesky::Traits::MatrixL & L = chol.matrixL();

Scalar quad_form = (L.solve(input - mean.template cast<Scalar>())).squaredNorm();
Scalar det = L.determinant();

return ceres::exp(Scalar(-input.rows()) * log_sqrt_2_pi - 0.5 * quad_form) / det;
}

Это приводит к ошибке компиляции в Eigen, особенно в строке, где det установлен в L.determinant(), Сообщение:

Eigen/src/Core/TriangularMatrix.h:371:16: error: could not convert ‘1’ from ‘int’ to ‘Eigen::TriangularView<const Eigen::Matrix<ceres::Jet<double, 7>, 3, 3, 0, 3, 3>, 1u>::Scalar {aka ceres::Jet<double, 7>}’
return 1;
^
Eigen/src/Core/TriangularMatrix.h:373:16: error: could not convert ‘0’ from ‘int’ to ‘Eigen::TriangularView<const Eigen::Matrix<ceres::Jet<double, 7>, 3, 3, 0, 3, 3>, 1u>::Scalar {aka ceres::Jet<double, 7>}’
return 0;

Глядя в упомянутый исходный файл Eigen, я нахожу:

Scalar determinant() const
{
if (Mode & UnitDiag)
return 1;
else if (Mode & ZeroDiag)
return 0;
else
return m_matrix.diagonal().prod();
}

Итак, насколько я понимаю, проблема в том, что Eigen мог вернуть 1 или 0 (которые ints), и int не может быть преобразован в ceres::Jet, Правильно ли я здесь, и если так, каков будет правильный способ справиться с этим?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector