我使用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
矩阵工作得很好。
我在这里缺少什么?
答案 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);
,然后重试。