【问题标题】:Have a class with an Eigen::matrix attribute that maps to a std::vector attribute有一个具有映射到 std::vector 属性的 Eigen::matrix 属性的类
【发布时间】:2017-01-26 23:46:20
【问题描述】:

我希望class Test 有一个映射到 Test::_a 的 Eigen::Matrix。 这意味着每当我更改 std::vector 时,Eigen::Matrix 也会立即反映更改,因为向量和矩阵都使用相同的内存块来保存数据。

这行得通:

#include <Eigen/Dense>
#include <vector>
int main() {
    std::vector<int> a;
    a.resize(10);
    typedef Eigen::Matrix<int, 1, Eigen::Dynamic>  mat_type;
    Eigen::Map< mat_type > a_eigen(a.data(), a.size());
}

但这不起作用....

#include <Eigen/Dense>
#include <vector>
class Test {
public:
    Test(int size) {
        _a.resize(size);
        _a_eigen(_a.data(), size );
    }
    std::vector<int> _a;
    Eigen::Map< Eigen::Matrix<int, 1, Eigen::Dynamic> > _a_eigen;
};
int main() {
    Test t(10);
}

下面也不起作用,因为 cout 什么也不打印

#include <Eigen/Dense>
#include <vector>
#include <iostream>
class Test {
public:
    typedef Eigen::Matrix<int, 1, Eigen::Dynamic> mat_type;
    Test(int size) {
        _a.resize(size);
        Eigen::Map<mat_type>(_a_eigen) = Eigen::Map<mat_type>(_a.data(), size );
        for (int i = 0; i < size; ++i) _a[i] = i;
    }
    std::vector<int> _a;
    mat_type _a_eigen;
};
int main() {
    Test t(10);
    std::cout << t._a_eigen;
}

【问题讨论】:

  • 看起来我无缘无故被否决了。

标签: c++ eigen eigen3


【解决方案1】:

您需要在类的构造函数的初始化列表中初始化 Map:

#include <Eigen/Core>
#include <vector>
class Test {
public:
    Test(int size) : _a(size), _a_eigen(_a.data(), size) { }
    std::vector<int> _a;
    Eigen::Map< Eigen::Matrix<int, 1, Eigen::Dynamic> > _a_eigen;
};

【讨论】:

  • 哇!答案!只是问题。如果构造函数将调整 std::vector 的大小,并可能更改 _a.data() 返回的指针,这很好吗?
  • 啊。我现在明白了。所以在这种情况下会很好。谢谢。
  • 之后您无法调整std::vector 的大小,因为这会(可能)使Eigen::Map 中的指针无效。 (如果您真的需要,可以使用placement-new 重新初始化Mapeigen.tuxfamily.org/dox/classEigen_1_1Map.html
猜你喜欢
  • 2019-07-08
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 2014-03-31
  • 2013-03-16
  • 1970-01-01
相关资源
最近更新 更多