C ++ Eigen:'Options':不是'Eigen :: MatrixBase <derived>'</derived>的成员

时间:2013-10-28 20:37:09

标签: c++ templates eigen

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

2 个答案:

答案 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();
}