我有一个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) –