eigen::Matrix 转 std::vector 数据错乱
时间: 2024-01-11 14:04:50 浏览: 216
在Eigen和std::vector之间进行数据转换时,需要注意数据的存储顺序。Eigen默认使用列优先存储,而std::vector默认使用行优先存储。因此,在进行数据转换时,需要根据数据存储顺序进行相应的转换。以下是一种将Eigen::Matrix转换为std::vector的方法:
```c++
Eigen::Matrix<double, 3, 3> mat;
std::vector<double> vec(mat.data(), mat.data() + mat.size());
```
在这个例子中,我们使用了Eigen::Matrix的data()函数来获取矩阵的数据指针,然后将其传递给std::vector的构造函数。这样做可以确保数据的存储顺序正确,从而避免数据错乱的问题。
相关问题
typedef std::vector<Eigen::Matrix2f, Eigen::aligned_allocator<Eigen::Matrix2f> > Matrix2fVector;
这是一个定义了名为Matrix2fVector的类型别名(typedef),它实际上是一个 std::vector<Eigen::Matrix2f> 类型的别名。其中,Eigen::Matrix2f 是一个2x2的浮点数矩阵类型,而 Eigen::aligned_allocator<Eigen::Matrix2f> 是一个自定义的内存分配器,用于确保该矩阵类型在内存中是对齐的。因此,这个类型别名定义了一个向量,其中每个元素都是一个2x2的浮点数矩阵,并且内存对齐方式是通过自定义的内存分配器来保证的。
Eigen::Vector3f 转std::vector<float>
可以使用Eigen库自带的Map函数将Eigen::Vector3f对象转换为std::vector<float>类型,代码如下:
```c++
#include <iostream>
#include <vector>
#include <Eigen/Core>
int main()
{
Eigen::Vector3f vec3f(1.23f, 2.34f, 3.45f);
std::vector<float> vec;
vec.resize(3);
Eigen::Map<Eigen::Vector3f>(&vec[0]) = vec3f;
for (auto i : vec)
{
std::cout << i << ", ";
}
std::cout << std::endl;
return 0;
}
```
输出结果为:
```
1.23, 2.34, 3.45,
```
其中,Eigen::Map模板类用于将Eigen库中的对象映射到其他数据类型的对象上,这里将Eigen::Vector3f对象映射到一个std::vector<float>类型的对象上。注意,在使用Eigen::Map时,需要保证目标对象的内存空间已经分配,否则会引发未定义的行为。
阅读全文
相关推荐
















