C++ 用于Ceres的多元正态PDF,使用特征值

C++ 用于Ceres的多元正态PDF,使用特征值,c++,eigen,ceres-solver,C++,Eigen,Ceres Solver,我正在尝试编写一个模板化方法,用于计算多元正态分布给定输入的概率密度。它以输入、平均向量和协方差矩阵作为输入 我想在Ceres成本函子中使用此方法,其中输入变量和平均值/协方差是固定的。目前,该方法如下所示: template <int Dim, class Scalar> Scalar mvn_norm_pdf(const Eigen::Matrix<Scalar, Dim, 1> & input, const Eig

我正在尝试编写一个模板化方法,用于计算多元正态分布给定输入的概率密度。它以输入、平均向量和协方差矩阵作为输入

我想在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源文件,我发现:

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

因此,据我所知,问题来自这样一个事实,即Eigen可以返回1或0(即
int
s),而int不能转换为
ceres::Jet
。我在这里吗?如果是的话,正确的处理方法是什么?

应该可以只写
const Scalar det=L.diagonal().prod()
。应该可以只写
const Scalar det=L.diagonal().prod()
Scalar determinant() const
{
  if (Mode & UnitDiag)
    return 1;
  else if (Mode & ZeroDiag)
    return 0;
  else
    return m_matrix.diagonal().prod();
}