2017-02-21 6 views
0

私はEigenライブラリを使ってC++でいくつかの行列を作成し、操作しています。 Eigenがインストールされ(Ubuntu 16.04)、動作しているようです。しかし、外部ファイルでクラスの一部として行列を宣言し、#includeに必要なファイルを宣言すると失敗します。マイKalmanFilter.hヘッダファイル:Eigenで簡単な行列を作る?

#include <Eigen/Dense> 
using Eigen::MatrixXd; 
class KalmanFilter { 
public: 
    KalmanFilter(double, double); 
    double initialX, initialY; 
    MatrixXd m; 
}; 

マイKalmanFilter.cppファイル:

#include <Eigen/Dense> 
#include "KalmanFilter.h" 
KalmanFilter::KalmanFilter(double inX, double inY) { 
    initialX = inX; 
    initialY = inY; 
    m(2, 1); 
    m << initialX, initialY; 
} 

そしてもちろん、私のmain.cppに:

#include <Eigen/Dense> 
#include "Utilities/KalmanFilter.h" 
int main() { 
    double a, b; 
    a = 1.0; 
    b = 2.0; 
    KalmanFilter KF(a, b); 
} 

すべてがすべての権利をコンパイルし、それを実行していますアサーションエラーが発生します。

main: /usr/local/include/Eigen/src/Core/DenseCoeffsBase.h:365: Eigen::DenseCoeffsBase<Derived, 1>::Scalar& Eigen::DenseCoeffsBase<Derived, 1>::operator()(Eigen::Index, Eigen::Index) [with Derived = Eigen::Matrix<double, -1, -1>; Eigen::DenseCoeffsBase<Derived, 1>::Scalar = double; Eigen::Index=long int]: Assertion 'row >= 0 && rows() && col >= 0 && col < cols()' failed. Aborted. 

もし私がMatrixXd m(2, 1);をKalmanFiter.cppファイル(MatrixXdであることを再宣言)に入れると、結果のコンパイルは実行されますが、m行列は空です(存在しますが、それを初期化する次の行はmain.cpp内の同じMatrixXd行列を宣言して初期化するだけでうまくいくので、私はほぼEigenが正しくインストールされているということはほぼ肯定的です。

私はここで何が欠けていますか?

答えて

2

問題は、KalmanFilter.cppの行にある:私は仮定として行列のサイズを変更していない

m(2, 1); 

あなたはそれがないと仮定します。それをm.resize(2, 1);と交換して、やり直してください。

3

m(2, 1);これはあなたの考えではありません。オブジェクトを作成しません。与えられた位置(operator())の係数を取得する構文なので、マトリックスmは空であり、要素を取得しようとします。

構文は同じように見えますが、プレースメントは大きな違いをもたらします。

あなたはメンバ初期化リスト内のメンバーオブジェクトを初期化する必要があります。

KalmanFilter::KalmanFilter(double inX, double inY) : m(2, 1) { 
//             ^^^^^^^ 
    initialX = inX; 
    initialY = inY; 
    m << initialX, initialY; 
} 
関連する問題