簡體   English   中英

標准::向量<Eigen::Vector3d>到本征::MatrixXd本征

[英]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::Matrix3XdMap函數:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM