eigen::Matrix 转 std::vector 数据错乱
时间: 2024-01-11 09:04:50 浏览: 43
在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的构造函数。这样做可以确保数据的存储顺序正确,从而避免数据错乱的问题。
相关问题
Eigen::Vector3f与std::vector转换
要将`Eigen::Vector3f`转换为`std::vector<double>`,可以使用以下方法:
```cpp
Eigen::Vector3f p{1, 2, 3};
std::vector<double> arg(p.data(), p.data() + p.size());
```
这里,我们使用了`p.data()`来获取`Eigen::Vector3f`的底层数据指针,并使用`p.size()`获取向量的大小。然后,我们用这些数据初始化了`std::vector<double>`。
要将`std::vector<double>`转换为`Eigen::Vector3f`,可以使用以下方法:
```cpp
std::vector<double> vec = {1.0, 2.0, 3.0};
Eigen::Map<Eigen::Vector3f> test(vec.data());
```
这里,我们使用`vec.data()`获取`std::vector<double>`的底层数据指针,并将其传递给`Eigen::Map`来创建一个`Eigen::Vector3f`。请注意,`Eigen::Map`不会拥有数据,它只是提供了对数据的访问。
请注意,在进行任何转换之前,确保`std::vector`和`Eigen::Vector3f`的大小是一致的,否则可能会导致错误或未定义的行为。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* [Eigen::vector与std::vector的相互转换](https://blog.csdn.net/github_39582118/article/details/120309991)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *3* [std::Vector -> eigen::vectorXd转换为](https://blog.csdn.net/weixin_41449637/article/details/130803639)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
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时,需要保证目标对象的内存空间已经分配,否则会引发未定义的行为。