【问题标题】:C++ Eigen: 'Options' : is not a member of 'Eigen::MatrixBase<Derived>'C++ Eigen:'Options':不是'Eigen::MatrixBase<Derived>'的成员
【发布时间】:2013-10-28 20:37:08
【问题描述】:

每当我尝试为 Eigen 创建模板化函数时,都会收到类似这样的错误:

错误 C2039: 'Options' : is not a member of '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 中的模板函数吗?

【问题讨论】:

    标签: c++ templates eigen


    【解决方案1】:

    为了完成大卫的回答,让我补充一点,您可以获得与给定表达式匹配的 Matrix 类型和 PlainObjectType。所以更通用的解决方案是:

    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);
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我正在尝试使所有功能尽可能类似于 matlab。在这种情况下,这意味着将其重命名为 eig,然后让函数直接返回特征值,而不是在缓冲区中。不过感谢您的解释 - 我会试一试!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多