[英]std::vector<Eigen::Vector3d> to Eigen::MatrixXd Eigen
我想知道是否有更簡單的方法來解決我的問題而不是使用 for 循環。 所以這里的情況是:
一般來說,我想從我的傳感器收集數據點(消息類型為Eigen::Vector3d
,我無法更改,因為它是一個巨大的框架)
收集的點應保存在 Eigen MatrixXd
(以便在優化算法中將它們作為矩陣進一步處理),矩陣的先驗維數部分未知,因為這取決於我將進行多少次測量(一維是 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*}
沒有已知的轉換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()
返回一個指向向量內第一個元素的指針(即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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.