每当我尝试为Eigen创建模板化函数时,我都会遇到类似这样的错误:
错误C2039:'选项':不是'Eigen :: MatrixBase'的成员
此错误来自以下函数
template<typename Derived1, typename Derived2>
void eig(const MatrixBase<Derived1> & A, MatrixBase<Derived2> & eigenvaluesBuff) {
EigenSolver<MatrixBase<Derived1>> es(A, false);
eigenvaluesBuff = es.eigenvalues().real().col(0);
}
矩阵A是由不同函数返回的MatrixXd。我有什么想法我做错了吗?如果函数返回一个MatrixXd,你能否直接将该结果传递给Eigen中的模板化函数?
答案 0 :(得分:1)
要完成David的回答,让我补充一点,您可以使用PlainObjectType获取与给定表达式匹配的Matrix类型。因此,更通用的解决方案是:
template<typename Derived1, typename Derived2>
void eig(const MatrixBase<Derived1> & A, MatrixBase<Derived2> & eigenvaluesBuff) {
EigenSolver<typename Derived1::PlainObjectType > es(A.derived(), false);
eigenvaluesBuff = es.eigenvalues().real().col(0);
}
答案 1 :(得分:0)
EigenSolver
的模板参数需要是更具体的Eigen::Matrix
模板的实例化,而不是Eigen::MatrixBase
(请参阅文档here)。所以我会将你的模板功能改为
template<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols, typename Derived2>
void eig(const Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> & A, MatrixBase<Derived2> & eigenvaluesBuff) {
typedef Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> MatrixType;
EigenSolver<MatrixType> es(A, false);
eigenvaluesBuff = es.eigenvalues().real().col(0);
}
您还可以将功能简化为
template<typename Derived1, typename Derived2>
void eig(const MatrixBase<Derived1> & A, MatrixBase<Derived2> & eigenvaluesBuff) {
eigenvaluesBuff = A.eigenvalues();
}