Их много ссылок, чтобы идти в другую сторону, но я не могу найти, чтобы получить std :: vector из Eigen :: Matrix или Eigen :: VectorXd в моем конкретном дело.typecasting Eigen :: VectorXd to std :: vector
15
A
ответ
19
vector<int> vec(mat.data(), mat.data() + mat.rows() * mat.cols());
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;
}
Спасибо он работал. Могу ли я узнать, как вы пришли к решению? –
'mat.rows() * mat.cols()' может быть упрощено до 'mat.size()', однако имейте в виду, что это решение работает только для простого объекта Matrix <> ', а при использовании карты <> ', так как в моем ответе также работает и для субматриц. – ggael