"=11=" "=10=" 和 "=12=" 本征

std::vector<Eigen::Vector3d> to Eigen::MatrixXd Eigen

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

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

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

目前,我创建了一个 std::vector<Eigen::Vector3d>,我通过 push_back 收集点数,完成收集点数后,我想通过使用操作将其转换为 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*}

的已知转换

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

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

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

原因是 Eigen::Map 需要一个指向基础 Scalar 类型的指针(在本例中 double*),而 std::vector::data() returns 一个指针向量中的第一个元素(即 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());