[英]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::Matrix3Xd
的Map
函数:
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.