在模板函数中使用 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++ 规定当标记可以是模板、类型或值时,取决于未绑定模板参数的类型,解析器应假定它是一个值。
程序员必须使用typename
和template
关键字来消除歧义。
我写了下面的函数:
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++ 规定当标记可以是模板、类型或值时,取决于未绑定模板参数的类型,解析器应假定它是一个值。
程序员必须使用typename
和template
关键字来消除歧义。