2014-09-29 7 views

Odpowiedz

19
vector<int> vec(mat.data(), mat.data() + mat.rows() * mat.cols()); 
+0

Dziękuję zadziałało. Czy mogę wiedzieć, w jaki sposób dotarłeś do rozwiązania? –

+2

'mat.rows() * mat.cols()' można uprościć do 'mat.size()', należy jednak pamiętać, że to rozwiązanie działa tylko dla zwykłego obiektu 'Matrix <>', podczas gdy używa się 'Mapy <> 'jak w mojej odpowiedzi działa również dla pod-macierzy. – ggael

30

nie można typecast, ale można łatwo skopiować dane:

VectorXd v1; 
v1 = ...; 
vector<double> v2; 
v2.resize(v1.size()); 
VectorXd::Map(&v2[0], v1.size()) = v1; 
+0

Hej dziękuję za odpowiedź .. ale znalazłem powyższą odpowiedź bardziej czyste. –

+3

fajnie, ponieważ działa on w obie strony (od i do VectorXd) – Raffi

1

Można to zrobić od a do Eigen wektorze:

//init a first vector 
    std::vector<float> v1; 
    v1.push_back(0.5); 
    v1.push_back(1.5); 
    v1.push_back(2.5); 
    v1.push_back(3.5); 

    //from v1 to an eignen vector 
    float* ptr_data = &v1[0]; 
    Eigen::VectorXf v2 = Eigen::Map<Eigen::VectorXf, Eigen::Unaligned>(v1.data(), v1.size()); 

    //from the eigen vector to the std vector 
    std::vector<float> v3(&v2[0], v2.data()+v2.cols()*v2.rows()); 


    //to check 
    for(int i = 0; i < v1.size() ; i++){ 
     std::cout << std::to_string(v1[i]) << " | " << std::to_string(v2[i]) << " | " << std::to_string(v3[i]) << std::endl; 
    }