我想知道是否有更简单的方法来解决我的问题,而不是使用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>*
你能告诉我如何使用map函数实现这个吗?
答案 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