"=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::Matrix3Xd
的 Map
函数:
Eigen::Matrix3Xd sensor_input = Eigen::Matrix3Xd::Map(sensor_input_vector[0].data(),
3, sensor_input_vector.size());
我想知道是否有比使用 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::Matrix3Xd
的 Map
函数:
Eigen::Matrix3Xd sensor_input = Eigen::Matrix3Xd::Map(sensor_input_vector[0].data(),
3, sensor_input_vector.size());