私は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が正しくインストールされているということはほぼ肯定的です。
私はここで何が欠けていますか?