Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用特征值创建简单矩阵? < >我使用了特征库来创建和操作C++中的一些矩阵。Eigen安装在Ubuntu16.04上,似乎正在运行。但是,当我在外部文件中将矩阵声明为类的一部分并包含必要的文件时,它失败了。My KalmanFilter.h头文件: #include <Eigen/Dense> using Eigen::MatrixXd; class KalmanFilter { public: KalmanFilter(double, double); double initialX, initialY; MatrixXd m; };_C++_Oop_Matrix_Eigen - Fatal编程技术网

用特征值创建简单矩阵? < >我使用了特征库来创建和操作C++中的一些矩阵。Eigen安装在Ubuntu16.04上,似乎正在运行。但是,当我在外部文件中将矩阵声明为类的一部分并包含必要的文件时,它失败了。My KalmanFilter.h头文件: #include <Eigen/Dense> using Eigen::MatrixXd; class KalmanFilter { public: KalmanFilter(double, double); double initialX, initialY; MatrixXd m; };

用特征值创建简单矩阵? < >我使用了特征库来创建和操作C++中的一些矩阵。Eigen安装在Ubuntu16.04上,似乎正在运行。但是,当我在外部文件中将矩阵声明为类的一部分并包含必要的文件时,它失败了。My KalmanFilter.h头文件: #include <Eigen/Dense> using Eigen::MatrixXd; class KalmanFilter { public: KalmanFilter(double, double); double initialX, initialY; MatrixXd m; };,c++,oop,matrix,eigen,C++,Oop,Matrix,Eigen,我的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/De

我的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.
如果我把矩阵设为xxd m2,1;在我的KalmanFiter.cpp文件中,重新声明它是一个矩阵xSD,生成的编译运行,但是m矩阵是空的,它存在,但是显然下一行应该初始化它的代码会无声地失败。我几乎肯定Eigen安装正确,因为在main.cpp中声明和初始化相同的MatrixXd矩阵可以正常工作


我错过了什么

问题是由KalmanFilter.cpp中的行引起的:

这不会像我假设的那样调整矩阵的大小。将其替换为m.resize2,1;然后再试一次。

m2,1;这和你想象的不一样。它不创建对象,而是获取给定位置的系数的语法,因此矩阵m为空,您尝试检索元素

语法看起来是一样的,但是位置有很大的不同

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

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