内存效率-EIGEN :: vectorxd在循环中

Memory Efficiency - Eigen::VectorXd in a loop

本文关键字:循环 vectorxd -EIGEN 内存 效率      更新时间:2023-10-16

我有一个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::Map创建Eigen::Matrix,然后我可以进行一次计算,并使其自动更新。所有Measurement对象?

您可能需要重新设计数据结构。当前,您有一个有许多间接的结构(AOS(。阵列结构(SOA(通常在内存访问中更有效。

呢?:

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

.rowwise().colwise()操作员可能足够强大,可以进行均匀的转换,这可以节省您编写内部循环。