用Eigen创建简单矩阵?

时间:2017-02-21 15:21:42

标签: c++ oop matrix eigen

我使用Eigen库在C ++中创建和操作一些矩阵。安装了Eigen(Ubuntu 16.04),似乎正在运行。但是,当我将矩阵声明为外部文件中的类的一部分并且#include必需的文件时,它会失败。我的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矩阵为空(它存在,但显然是下一行& #39; s应该初始化它无声地失败)。我几乎肯定Eigen是正确安装的,因为在main.cpp中声明和初始化相同的MatrixXd矩阵工作得很好。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:3)

m(2, 1);这不符合你的想法。它不会创建对象,它是在给定位置(operator())获取系数的语法,因此矩阵m为空,并且您尝试检索该元素。

语法似乎相同,但展示位置有很大的不同。

您需要在成员初始化列表中初始化成员对象:

KalmanFilter::KalmanFilter(double inX, double inY) : m(2, 1) {
//                                                   ^^^^^^^
  initialX = inX;
  initialY = inY;
  m << initialX, initialY;
}

答案 1 :(得分:2)

问题是由KalmanFilter.cpp

中的行引起的
m(2, 1);

这并没有像我假设的那样调整矩阵的大小。将其替换为m.resize(2, 1);,然后重试。