2

每当我尝试为 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 中的模板函数?

4

2 回答 2

1

为了完成大卫的回答,让我补充一点,您可以使用 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);
}
于 2013-10-28T22:30:09.160 回答
0

的模板参数EigenSolver需要是更具体Eigen::Matrix模板的实例化,而不是(请参阅此处Eigen::MatrixBase的文档)。所以我会将您的模板功能更改为

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();
}
于 2013-10-28T20:50:45.257 回答