2017-02-21 135 views
0

我正在使用Eigen庫來創建和操縱C++中的一些矩陣。 Eigen安裝(Ubuntu 16.04),似乎正在工作。但是,當我在外部文件中聲明矩陣作爲類的一部分並且必要的文件時,它將失敗。我KalmanFilter.h頭文件:使用特徵創建簡單矩陣?

#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矩陣是空的(它存在,但顯然下一行應該默認初始化失敗)。我幾乎肯定Eigen安裝正確,因爲在我的main.cpp中聲明和初始化相同的MatrixXd矩陣工作得很好。

我在這裏錯過了什麼?

回答

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