2014-09-29 1 views

ответ

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

Спасибо он работал. Могу ли я узнать, как вы пришли к решению? –

+2

'mat.rows() * mat.cols()' может быть упрощено до 'mat.size()', однако имейте в виду, что это решение работает только для простого объекта Matrix <> ', а при использовании карты <> ', так как в моем ответе также работает и для субматриц. – ggael

30

Вы не можете типаж, но вы можете легко скопировать данные:

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

heyy thankyou для ответа .. но я нашел выше ответ более чистым. –

+3

приятно, потому что он работает в обоих направлениях (от и до VectorXd) – Raffi

1

Вы можете сделать это от и до Эйгеном вектора:

//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; 
    }