【问题标题】:How to correctly use a matrix (Eigen library) in my own class in C++?如何在我自己的 C++ 类中正确使用矩阵(特征库)?
【发布时间】:2017-11-03 04:08:07
【问题描述】:

我确实尝试过解决这个问题,并且我在 Stackoverflow 上阅读了很多 QA,但不知何故没有任何帮助。

我正在尝试使用 Eigen 库中的自己的矩阵和向量来实现一个类。我正在使用带有 GNU GCC 编译器的 Code::Blocks。

这是我的意思的一个简单示例,但它不是确切的代码,因为我使用了更多的矩阵和向量以及其他大小(4x4 矩阵、2x4 矩阵、4x1 向量和 2x1 向量):

    class MYCLASS{
        private:

            VectorXd x;
            MatrixXd A;

        public:

            MYCLASS(double, double, double, double);
            double get_matval();

    };

    MYCLASS::MYCLASS(double deltaT, double q_var, double r1_var, double r2_var){

        x_m(0)=q_var;
        x_m(1)=r1_var;
        x_m(2)=r2_var;
        x_m(3)=0.0;

        A(0,0)= deltaT;
        A(0,1)= 0.0;
        A(1,0)= 0.0;
        A(1,1)= 0.0;

    }

    double MYCLASS::get_matval(){

        return A(0,0);

    }

1.当我创建一个MYCLASS的对象时,像这样:

MYCLASS myobject(10, 0.5, 0.1, 0.75);

==> 编译很好,但是当它运行时,程序会因以下确切描述而崩溃(请记住,我还有其他矩阵和向量):

断言失败:index >= 0 && index

此应用程序已请求运行时终止它 不寻常的方式。请联系...

进程返回 3 (0x3) 执行时间:2.131 s

2. 如果我在构造函数的开头加上这个:

    MYCLASS::MYCLASS(double deltaT, double q_var, double r1_var, double r2_var){

            VectorXd x(4);
            MatrixXd A(2,2);

            x_m(0)=q_var;
            x_m(1)=r1_var;

            ...and so on...

==> 那么在构造对象的时候==> 没有错误

==> 但是当我想使用函数 get_matval 访问 A(0,0) 时,如下所示:

MYCLASS myobject(10, 0.5, 0.1, 0.75);

double myvar = myobject.get_matval();

...它再次崩溃并显示相同的错误消息。

你们能帮忙吗?

【问题讨论】:

  • VectorXd x(4); 在您的构造函数中创建一个新的局部变量,该变量与您的类中的 x 变量无关。
  • 看起来你需要在添加元素之前设置大小。我对 eigen 库一无所知,我希望您至少可以在构造函数初始化列表中做到这一点。
  • 查看文档有一个 resize() 函数,它也可以让你初始化大小。 eigen.tuxfamily.org/dox/group__TutorialMatrixClass.html
  • 嘿,我不敢相信,但这真的很有帮助!我只需要在构造函数的开头调整矩阵和向量的大小!例如A.调整大小(2,2)。那行得通!非常感谢!

标签: c++ class matrix vector eigen


【解决方案1】:

即使您已经找到了解决方案,以下是如何正确初始化(有限数量的)特征矩阵:

MYCLASS::MYCLASS(double deltaT, double q_var, double r1_var, double r2_var)
                : x(4), A(2,2) { // use initializer list to construct x and A
    x << q_var, r1_var, r2_var, 0.0;
    A << deltaT, 0.0, 0.0, 0.0;
}

【讨论】:

  • 谢谢。但是如果我有 20 个矩阵呢?即使那样,这也是要走的路吗?我的初始化列表中有 20 个矩阵吗?
  • 如果你有很多矩阵,你应该考虑将它们存储到std::vector&lt;Eigen::MatrixXd&gt;,而不是。但是在初始化器列表中初始化 20 个变量是没有问题的(我不知道最小的数字是多少,但是符合标准的编译器必须支持)
猜你喜欢
  • 2015-11-30
  • 2022-07-10
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多