内存效率-EIGEN :: vectorxd在循环中
Memory Efficiency - Eigen::VectorXd in a loop
我有一个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()
操作员可能足够强大,可以进行均匀的转换,这可以节省您编写内部循环。
相关文章:
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 为什么在这个代码结束循环中没有得到结束
- 在基于范围的for循环中使用结构化绑定声明
- 用于C++中带有数组和指针的循环
- 循环中的随机函数
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 内存效率-EIGEN :: vectorxd在循环中