【问题标题】:Creating simple matrices with Eigen?用 Eigen 创建简单的矩阵?
【发布时间】:2017-02-21 15:21:41
【问题描述】:

我正在使用 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 矩阵工作得很好。

我在这里缺少什么?

【问题讨论】:

    标签: c++ oop matrix eigen


    【解决方案1】:

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

    语法看似相同,但位置差异很大。

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

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

    【讨论】:

      【解决方案2】:

      问题出在KalmanFilter.cpp中的那一行:

      m(2, 1);
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多