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

David の回答を完成させるために、指定された式に一致する 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);
}
于 2013-10-28T22:30:09.160 に答える
0

のテンプレート パラメータは、より具体的なテンプレートEigenSolverのインスタンス化である必要があります(こちらのドキュメントを参照してください)。したがって、テンプレート関数を次のように変更しますEigen::MatrixEigen::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 に答える