Their are many links to go the other way round but I am unable to find to get a std::vector from a Eigen::Matrix or Eigen::VectorXd in my specific case.
Asked
Active
Viewed 4.8k times
3 Answers
60
vector<int> vec(mat.data(), mat.data() + mat.rows() * mat.cols());

John Zwinck
- 239,568
- 38
- 324
- 436
-
8`mat.rows() * mat.cols()` can be simplified to `mat.size()`, however, be aware that this solution only work for a plain `Matrix<>` object, while using a `Map<>` as in my answer works for sub-matrices too. – ggael Sep 29 '14 at 10:58
-
3If someone needs to copy a row of a matrix into a vector: `vector
vec(arr.cols()); Map – zardosht Jun 14 '20 at 17:57(&vec[0], 1, mat.cols()) = mat.row(0);`
58
You cannot typecast, but you can easily copy the data:
VectorXd v1;
v1 = ...;
vector<double> v2;
v2.resize(v1.size());
VectorXd::Map(&v2[0], v1.size()) = v1;

ggael
- 28,425
- 2
- 65
- 71
2
You can do this from and to Eigen vector :
//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;
}

Bastienm
- 363
- 2
- 16