c – std :: vector到Eigen :: MatrixXd Eigen

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

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

聚集点应该保存在Eigen MatrixXd中(为了进一步处理它们作为优化算法中的矩阵),Matrix的尺寸apriori部分未知,因为它取决于我将采取多少测量(一维是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 *}

你能告诉我如何使用map函数实现它吗?

解决方法:

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

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

原因是Eigen :: Map需要指向底层Scalar类型的指针(在本例中为double *),而std :: vector :: data()返回指向vector中第一个元素的指针(即,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中更改它们,反之亦然.

上一篇:SLAM / 3D Vision求职专题 | SLAM知识篇(D3)


下一篇:c – 非常小的方阵的特征线性解算器