在模板函数中使用 Eigen::LLT

Using Eigen::LLT within a templated function

我写了下面的函数:

template<typename mattype, typename vectype>
    inline static boost::any ApplyCholesky(boost::any const& A, boost::any const& x) {
    const Eigen::LLT<mattype>& chol = boost::any_cast<Eigen::LLT<mattype> const&>(A);

    const mattype& mat = chol.matrixL();
    const vectype& vec = boost::any_cast<vectype const&>(x);
    assert(mat.cols()==vec.size());

    vectype soln = mat.triangularView<Eigen::Lower>()*mat.transpose()*vec;

    return soln;
  }

基本上,我希望能够调用如下内容:

ApplyCholesky<Eigen::MatrixXd, Eigen::VectorXd>(A, x);
ApplyCholesky<Eigen::Matrix4d, Eigen::Vector4d>(A, x);
ApplyCholesky<Eigen::Matrix2f, Eigen::Vector2f>(A, x);

但是,我收到以下错误:

error: expected expression
    vectype soln = mat.triangularView<Eigen::Lower>()*mat.transpose()*vec;

我想不通我做错了什么。我有一个类似的 ApplyInverseCholesky 解决线性系统(即,我需要两个函数:(i)y = A x 和(ii)y = A ^ {-1} x)具有相同的错误

vectype soln = mat.template triangularView<Eigen::Lower>()*mat.transpose()*vec;

它将 < 解析为小于,将 > 解析为大于。然后它死于 ().

这是因为 triangularView 是否为模板取决于 mat 的类型。为了简化解析,C++ 规定当标记可以是模板、类型或值时,取决于未绑定模板参数的类型,解析器应假定它是一个值。

程序员必须使用typenametemplate关键字来消除歧义。