std :: vector <eigen :: vector3d>到Eigen :: MatrixXd Eigen

时间:2018-04-13 09:13:19

标签: c++ eigen

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

一般来说,我想从我的传感器收集数据点(消息类型为<label>Rows</label> <input type="number" id="irow"> <label>Cols</label> <input type="number" id="icol"> <input type="submit" id="smit1"> <input type="number" id="valx" placeholder="x"> <input type="number" id="valy" placeholder="y"> <input type="submit" id="smit2"> <table id="table"> </table>,我无法改变这一点,因为它是一个巨大的框架)

聚集点应该保存在Eigen Eigen::Vector3d中(为了进一步处理它们作为优化算法中的矩阵),Matrix的尺寸apriori部分未知,因为它取决于我有多少测量我将采取(一维是3,因为有x,y,z坐标)

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

MatrixXd

但是我有一个错误并注意:从 sensor_input = Eigen::Map<Eigen::MatrixXd>(sensor_input_vector.data(),3,sensor_input_vector.size()); Eigen::Matrix<double, 3, 1>*

的参数1没有已知的转换

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

2 个答案:

答案 0 :(得分: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()将为您提供指向Vector3d第一个元素的第一个(std::vector)条目的指针。或者,你可以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

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

答案 1 :(得分:0)

此解决方案应该有效:

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

由于您的输出将是3 x N的矩阵(N是3D向量的数量),因此您也可以使用Map的{​​{1}}函数:

Eigen::Matrix3Xd