【发布时间】:2013-07-25 15:32:25
【问题描述】:
我会给出一些关于我为什么要这样做的背景,但最终可以忽略背景,因为它主要是一个经典的计算机科学和 C++ 问题(之前肯定已经问过这个问题,但是有几个粗略的搜索没有发现任何东西......)
我正在使用(大型)实时流式点云,并且有一个案例,我需要从多个传感器获取 2/3/4 点云并将它们粘在一起以创建一个大型点云。我的情况是,我确实需要一个结构中的所有数据,而通常当人们只是将点云可视化时,他们可以将它们单独输入查看器。
我使用的是 Point Cloud Library 1.6,仔细观察它的PointCloud class(如果您有兴趣,在<pcl/point_cloud.h> 下)将所有数据点存储在一个 STL 向量中。
现在我们又回到了原版 CS...
PointCloud 有一个 += 运算符,用于将一个点云的内容添加到另一个点云。到目前为止,一切都很好。但是这种方法效率很低——如果我理解正确的话,它 1) 调整目标向量的大小,然后 2) 遍历另一个向量中的所有点,并将它们复制过来。
在我看来,这就像 O(n) 时间复杂度的情况,通常情况下可能不会太糟糕,但在实时处理每个云至少 300K 点时是个坏消息。
向量不需要被排序或分析,它们只需要在内存级别“粘在一起”,所以程序知道一旦它到达第一个向量的末尾,它只需要跳转到第二个的开始位置。换句话说,我正在寻找一种 O(1) 向量合并方法。在 STL 中有没有办法做到这一点?或者它更像是 std::list#splice 之类的领域?
注意:本课程是 PCL 的一个非常基础的部分,因此“非侵入性手术”更为可取。如果需要对类本身进行更改(例如从向量更改为列表,或保留内存),则必须根据对 PCL 其余部分的连锁效应来考虑它们,这可能会影响深远。
更新:我已在 PCL 的 GitHub 存储库中提交了一个问题,以便与库作者就以下建议进行讨论。一旦确定了采用哪种方法,我将接受相关建议作为答案。
【问题讨论】:
-
据我所知这是不可能的。为什么不将向量保留到您喜欢的大容量?
-
我知道 C++、C 和 C#。但是什么是 CS?
-
我认为 OP 是指计算机科学。
-
@user1475135:向量很少调整大小,即使使用
+=。如果它实际上是std::vector,那么别担心,这不是你的问题。 -
它有可能简单地通过在创建时推回
N点然后将它们全部删除来以非侵入方式保留内存。
标签: c++ stl point-cloud-library