2017-05-31 139 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()运营商可能是足够强大的做均匀的变换,这将节省您写的内部循环。