gpt4 book ai didi

c++ - 内存效率 - 循环中的 Eigen::VectorXd

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:13:48 36 4
gpt4 key购买 nike

我有一个 Measurement有两个 Eigen::VectorXd 的对象成员 -- 一个用于 position和另一个velocity .

测量值通过扫描排列在数据集中——即,在每个时间步,一个新的测量值扫描被添加到数据集中。这些类型定义为:

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::Matrix来自 Eigen::Map然后我可以进行一次计算并让它自动更新所有 Measurement 的两个成员对象?

最佳答案

您可能想要修改您的数据结构。目前,您有一个结构数组 (AOS),其中包含许多间接寻址。数组结构 (SOA) 通常在内存访问方面更高效。

那呢?

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

.rowwise().colwise() 运算符可能足够强大以进行齐次转换,这将节省您编写内部循环的时间。

关于c++ - 内存效率 - 循环中的 Eigen::VectorXd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44294689/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com