gpt4 book ai didi

c++ - 使用 Eigen 创建简单矩阵?

转载 作者:太空宇宙 更新时间:2023-11-04 16:01:53 27 4
gpt4 key购买 nike

我正在使用 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 矩阵为空(它存在,但显然应该初始化它的下一行静默失败)。我几乎肯定 Eigen 已正确安装,因为在我的 main.cpp 中声明和初始化相同的 MatrixXd 矩阵工作得很好。

我在这里错过了什么?

最佳答案

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

语法看似相同,但位置却大不相同。

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

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

关于c++ - 使用 Eigen 创建简单矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42371296/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com