【问题标题】:std::vector<Eigen::Vector3d> to Eigen::MatrixXd Eigenstd::vector<Eigen::Vector3d> 到 Eigen::MatrixXd Eigen
【发布时间】:2018-04-13 09:13:19
【问题描述】:

我想知道是否有比使用 for 循环更简单的方法来解决我的问题。所以情况如下:

一般来说,我想从我的传感器收集数据点(消息类型为Eigen::Vector3d,我无法更改它,因为它是一个巨大的框架)

收集的点应保存在 Eigen MatrixXd 中(以便在优化算法中将它们作为矩阵进一步处理),矩阵的先验维度部分未知,因为这取决于我将进行多少次测量(一维是3,因为有x,y,z坐标)

目前,我创建了一个std::vector&lt;Eigen::Vector3d&gt;,通过push_back 收集积分,收集完积分后,我想通过操作Map 将其转换为MatrixXd

 sensor_input = Eigen::Map<Eigen::MatrixXd>(sensor_input_vector.data(),3,sensor_input_vector.size());

但我有一个错误并注意:没有已知的参数 1 从 Eigen::Matrix&lt;double, 3, 1&gt;*Eigen::Map&lt;Eigen::Matrix&lt;double, -1, -1&gt;, 0, Eigen::Stride&lt;0, 0&gt; &gt;::PointerArgType {aka double*} 的转换

你能告诉我如何使用地图函数来实现吗?

【问题讨论】:

  • 使用 for 循环有什么问题?
  • 我只是好奇/感兴趣,有没有更简单的方法,我假设 map 比 for 循环更有效?
  • Map 是去这里的正确方法。但是你应该发布一个实际的minimal reproducible exampleEigen::Map 是模板类型,所以你上面的代码根本无法编译。
  • 在其他语言中,map 可能更有效。在 C++ 中,一切都是一样的
  • 好的,你的 mcve 只是因为格式不正确而搞砸了。你需要写sensor_input_vector[0].data() 而不是sensor_input_vector.data()

标签: c++ eigen


【解决方案1】:

简答:你需要写(确保你的输入不为空):

sensor_input = Eigen::Map<Eigen::MatrixXd>(sensor_input_vector[0].data(),3,sensor_input_vector.size());

原因是Eigen::Map 需要一个指向底层Scalar 类型的指针(在本例中为double*),而std::vector::data() 返回一个指向向量内第一个元素的指针(即Eigen::Vector3d* )。

现在sensor_input_vector[0].data() 将为您提供指向std::vector 的第一个元素的第一个(Vector3d) 条目的指针。或者,您可以像这样reinterpret_cast

sensor_input = Eigen::Map<Eigen::MatrixXd>(reinterpret_cast<double*>(sensor_input_vector.data()),3,sensor_input_vector.size());

在许多情况下,您实际上可以避免将数据复制到Eigen::MatrixXd,而是直接使用Eigen::Map,而不是MatrixXd,您可以使用Matrix3Xd 来表示在编译时已知正好有 3 行:

// creating an Eigen::Map has O(1) cost
Eigen::Map<Eigen::Matrix3Xd> sensor_input_mapped(sensor_input_vector[0].data(),3,sensor_input_vector.size());
// use sensor_input_mapped, the same way you used sensor_input before

您需要确保在使用sensor_input_mapped 时不会重新分配底层std::vector。此外,更改 std::vector 的各个元素将更改 Map 中的它们,反之亦然。

【讨论】:

  • 你似乎在假设sensor_input_vector[0].data() + sensor_input_vector[0].size() == sensor_input_vector[1].data()。 Eigen 能保证吗?
  • @Caleth 是的,对于所有固定大小的数据类型,这是有保证的。
  • @chtz,如果sensor_input_vector 是 VectorXd(不是 Vector3d),您的答案将不起作用。你对动态大小特征向量VectorXd有什么建议吗?
  • @JohnPekl 如果您的意思是std::vector&lt;Eigen::VectorXd&gt;,则不能将其映射到Eigen::Map,因为数据不连续。
【解决方案2】:

这个解决方案应该有效:

Eigen::MatrixXd sensor_input = Eigen::MatrixXd::Map(sensor_input_vector[0].data(),
 3, sensor_input_vector.size());

由于您的输出将是 3 x N 的矩阵(N 是 3D 向量的数量),您也可以使用 Eigen::Matrix3XdMap 函数:

Eigen::Matrix3Xd sensor_input = Eigen::Matrix3Xd::Map(sensor_input_vector[0].data(),
 3, sensor_input_vector.size());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-08
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多