我有一個Measurement
對象有兩個Eigen::VectorXd
成員 - 一個用於position
和另一個velocity
。內存效率 - Eigen :: VectorXd在循環中
通過掃描將測量結果排列在數據集中 - 即在每個時間步將新的測量結果添加到數據集中。這些類型被定義爲:
typedef std::shared_ptr<Measurement> MeasurementPtr;
typedef std::vector<MeasurementPtr> scan_t;
typedef std::vector<scan_t> dataset_t;
在我的算法的每次迭代的開始,我需要一個新的轉換應用到每個測量。目前,我有:
for (auto scan = dataset_.begin(); scan != dataset_.end(); ++scan)
for (auto meas = scan->begin(); meas != scan->end(); ++meas) {
// Transform this measurement to bring it into the same
// coordinate frame as the current scan
if (scan != std::prev(dataset_.end())) {
core::utils::perspective_transform(T_, (*meas)->pos);
core::utils::perspective_transform(T_, (*meas)->vel);
}
}
凡perspective_transform
定義爲
void perspective_transform(const Eigen::Projective2d& T, Eigen::VectorXd& pos) {
pos = (T*pos.homogeneous()).hnormalized();
}
添加該代碼由40倍提高計算時間,當我與數據集中在每次掃描50個測量掃描運行算法 - 使其相當慢。我相信這是因爲我有550個小對象,每個都有2個Eigen
內存寫入。我將結果寫入內存,而我的基準測試結果僅略有下降 - 表明這是一個內存效率問題,而不是計算瓶頸。
如何加快此計算速度?是否有辦法先循環並從Eigen::Map
創建Eigen::Matrix
,然後我可以執行一次計算並讓它自動更新所有Measurement
對象的兩個成員?
使用固定大小的矢量代替動態大小的矢量。 – max
如果你想分享'homogeneous()'和'hnormalized()'的代碼,真正找到根本原因。 – codekaizer
@codekaizer'homogeneous()'和'hnormalized()'都是'Eigen' [庫方法](https://eigen.tuxfamily.org/dox/classEigen_1_1Homogeneous.html) –