2017-05-31 138 views
0

我有一個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對象的兩個成員?

+0

使用固定大小的矢量代替動態大小的矢量。 – max

+0

如果你想分享'homogeneous()'和'hnormalized()'的代碼,真正找到根本原因。 – codekaizer

+0

@codekaizer'homogeneous()'和'hnormalized()'都是'Eigen' [庫方法](https://eigen.tuxfamily.org/dox/classEigen_1_1Homogeneous.html) –

回答

0

您可能想要重做您的數據結構。 目前,您有一個結構數組(AOS),帶有許多間接指針。 數組結構(SOA)在內存訪問中通常更高效。

怎麼樣?

struct Scant_t 
{ 
    Eigen::MatrixXd position; 
    Eigen::MatrixXd velocity; 
} 

.rowwise().colwise()運營商可能是足夠強大的做均勻的變換,這將節省您寫的內部循環。