2017-01-26 6 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> 
#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

cout을 인쇄 아무것도 있기 때문에 아래

#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); 
} 

이 작동하지 않습니다 클래스의 생성자의 initializer-list에서 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; 
}; 
+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