2017-01-26 27 views
2

我想要class Test具有映射到Test :: _ a的Eigen :: Matrix。 这意味着无论何时我更改std :: vector,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; 
} 
+0

看起来像我无缘无故downvoted。 –

回答

4

你需要不起作用初始化您的类的构造函数的初始化程序列表中的地图:

#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; 
}; 
+0

Woot!一个答案!只是在问题上。如果构造函数调整std :: vector并且可能会改变_a.data()返回的指针,这是否正确? –

+0

啊。我现在得到这个。所以在这种情况下会很好。谢谢。 –

+0

之后,您不能调整'std :: vector'的大小,因为这会(有效)使Eigen :: Map中的指针无效。 (如果您确实需要:可以使用placement-new重新初始化Map,请执行以下操作:http://eigen.tuxfamily.org/dox/classEigen_1_1Map.html) – chtz