繁体   English   中英

标准::向量<Eigen::Vector3d>到本征::MatrixXd本征

[英]std::vector<Eigen::Vector3d> to Eigen::MatrixXd Eigen

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

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

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

目前,我创建了一个std::vector<Eigen::Vector3d> ,我通过 push_back 收集点,在我完成收集点后,我想使用操作 Map 将其转换为MatrixXd

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

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

你能告诉我如何通过使用地图函数来实现这一点吗?

简短回答:您需要编写(在确保您的输入不为空后):

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更改它们,反之亦然。

此解决方案应该有效:

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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM