- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用基于点云库 (PCL) 的 kd-tree 最近邻 (NN) 搜索的 C++ 实现。该数据集包含约 220 万个点。我正在为每个其他点搜索 NN 点。搜索半径设置为 2.0。要完全计算它,大约需要 12 个小时!我使用的是带有 4GB RAM 的 Windows 64 位机器。 kd-tree 搜索很常见吗?不知道有没有其他c++库用于3D点云数据,速度更快。我听说过 ANN C++ 库和 CGAL,但不确定它们有多快。
最佳答案
简而言之:
您只能确定是否自己运行时间测量。
您应该确保 NN 库是否比蛮力更快,这可能是您的数据的情况。
正如安德拉斯在评论中提到的,搜索半径也起着重要作用。如果很多点落在搜索半径内,搜索会变得非常缓慢。
完整答案:
3维并不多。问题的发生是由于您拥有的点数。
ANN 代表近似最近邻搜索。当涉及到 NNS(最近邻搜索)时,接受准确性和速度之间的权衡是很常见的。
这意味着您可以更快地执行搜索,但您可能找不到确切的 NN,而是一个接近的 NN(例如,不是最近的点,而是第二个最近的点,依此类推)。更高的速度意味着更低的准确性,反之亦然。
CGAL 还有一个参数 epsilon,代表精度(ε = 0 表示完全精度)。 CGAL 旨在达到 3 维,因此您可以试一试。
我可以测试自己并发布答案。但是,这不会是 100% 安全的,因为您拥有的积分可能有一些关系。如果要利用点(可能)彼此之间的关系,这对于库的性能非常重要。
另一个需要考虑的因素,安装的简易性。
CGAL 很难安装。当我这样做时,我遵循了 these 步骤。
ANN 易于安装。
我还建议您看一下 BOOST Geometry,它可能会派上用场。
FLANN 在该领域也是一个强大的参与者,但我不建议这样做,因为它旨在处理更大维度的数据集(例如 128)。
....
好吧,我承认,我现在对自己很好奇,我要进行一些测试!
....
人工神经网络
(我没有发布代码,所以答案不会太大。文档中有示例,如果您愿意,当然可以询问!)。
输出:
//对于克莱因瓶
samaras@samaras-A15:~/Inria/nn_libs/ANN/ann_1.1.2/code$ g++ main.cpp -O3 -I ../include/ -L../lib -lANN -std=c++0x -o myExe
samaras@samaras-A15:~/Inria/nn_libs/ANN/ann_1.1.2/code$ ./myExe
N = 1000000
D = 3
ε = 0 // full accuracy
Misses: 0
creation of the tree took 1.06638 seconds.
Brute force for min: 0.009985598 seconds.
NN for 0.0 0.000078551 seconds.
Speedup of ANN for NN = 8.721533780
ε = 0.1
我得到:
Misses: 1000
creation of the tree took 0.727613 seconds.
Brute force for min: 0.006351318 seconds.
NN for 0.0 0.000004260 seconds.
Speedup of ANN for NN = 8.678169573
ε = 0
Misses: 0
creation of the tree took 1.28098 seconds.
Brute force for min: 0.006382912 seconds.
NN for 0.0 0.000022341 seconds.
Speedup of ANN for NN = 4.897436311
ε = 0.1
Misses: 1000
creation of the tree took 1.25572 seconds.
Brute force for min: 0.006482465 seconds.
NN for 0.0 0.000004379 seconds.
Speedup of ANN for NN = 5.144413371
samaras@samaras-A15:~/code/NN$ ./myExe
ε = 0
SplitingRule = Sliding_midpoint, N = 1000000, D = 3
creation of the tree took 0.02478 seconds.
Tree statistics:
Number of items stored: 1000000
Number of nodes: 471492
Tree depth: 34
0x80591e4
Brute force for min: 0.007979495 seconds.
NN for 0.0 0.008085704 seconds.
Speedup of cgal for NN = 0.983849423
ε = 0.1
SplitingRule = Sliding_midpoint, N = 1000000, D = 3
creation of the tree took 0.02628 seconds.
Tree statistics:
Number of items stored: 1000000
Number of nodes: 471492
Tree depth: 34
0x80591e4
Brute force for min: 0.007852951 seconds.
NN for 0.0 0.007856228 seconds.
Speedup of cgal for NN = 0.996250305
samaras@samaras-A15:~/code/NN$ ./myExe
ε = 0
SplitingRule = Sliding_midpoint, N = 1000000, D = 3
creation of the tree took 0.025502 seconds.
Tree statistics:
Number of items stored: 1000000
Number of nodes: 465002
Tree depth: 32
0x80591e4
Brute force for min: 0.007946504 seconds.
NN for 0.0 0.007981456 seconds.
Speedup of cgal for NN = 0.992449817
samaras@samaras-A15:~/code/NN$ ./myExe
ε = 0.1
SplitingRule = Sliding_midpoint, N = 1000000, D = 3
creation of the tree took 0.025106 seconds.
Tree statistics:
Number of items stored: 1000000
Number of nodes: 465002
Tree depth: 32
0x80591e4
Brute force for min: 0.008115519 seconds.
NN for 0.0 0.008117261 seconds.
Speedup of cgal for NN = 0.996702679
关于nearest-neighbor - PCL kd-tree 实现速度极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25453370/
假设您有一个对象列表,每个对象都需要计算距离它最近的对象以进行拍摄。这个对象有一个 x 和一个 y 值。物体也在移动。 kd树还有用吗?我不确定,因为如果物体在移动,你必须继续创建这个 kd 树。 我
我正在查看 KD 树的维基百科页面。例如,我在 python 中实现了用于构建列出的 kd 树的算法。 但是,使用 KD 树进行 KNN 搜索的算法会切换语言并且并不完全清楚。英文解释开始有意义,但它
Kd 算法首先通过划分基元数组(三角形、球体等)来创建根 BSP 节点,以便创建两个新数组(左基元和右基元),用于创建其两个基元子树。 左基元和右基元是通过将给定基元数组划分为两个数组来计算的。通过取
我(尝试)在Processing/Java中实现KD树,并遵循我在数十篇文章和维基百科文章中看到的逻辑,但我一定做错了什么,因为输出如下所示: 而不是这个: 显然有些东西不对劲,因为节点是重复的,而且
我有以下路径数据: id1 p1 p2 0 1 7.935 5.103 1 1 7.93
我正在阅读 C 中的 kd 树实现。这是其中的一些部分。问题出在 findmedian 函数中。我不明白 的实现 *md = start +(end-start)/2; ...... -> 其他不相关
给定一组数据点,kdtree是在它们之上创建的,但是这个 kdtree 是唯一的吗? 最佳答案 这似乎取决于您构建树的方式。维基百科文章提到中点的选择如何影响生成的树是否平衡。如果选择不同的点,那么树
警告:相当长的问题,也许太长了。如果是这样,我深表歉意。 我正在开发一个涉及 kd 树的最近邻搜索的程序(在本例中,它是一棵具有 3961 个独立点的 11 维树)。我们才刚刚了解它们,虽然我很好地掌
我目前正在尝试构建二维(纬度和经度)的 KD 树以查询最近的坐标。我将坐标(ID、纬度、经度)推送到一个 vector 中,并将该 vector 传递到我的 KD-Tree 的构造函数中。 但是当我在
我正在尝试为我的 C++ (DirectX) 项目实现一个 kd-tree 以加速我的碰撞检测。我的实现是一个非常原始的递归函数。第 nth_element 似乎工作正常(如果我将其注释掉,则只有 1
我为两组点构建了 kd 树,以便找到两组点之间最接近的双色配对: kd 树存储为 python 字典,可以在下面的代码中找到,并传递给一个函数('closest'),该函数旨在同时递归地分析两棵树以找
我正在尝试基于递归构建一个二维树。我可以将算法总结如下: > ALGORITHM BuildKDTree(P,depth) > 1. if P contains only one po
我想从平衡的 KD 树中删除一个元素,并且树在不重建整棵树的情况下保持平衡。这有可能在不重建整棵树的情况下平衡树吗?如果是那么怎么办? 最佳答案 对于标准的 k-d 树,您可以删除项目但没有重新平衡,
所以我们有一个无限的 3d 世界,我们需要查询最近的点。然而我们的点有标识符并且一直在移动。支持数据点的 KDtree\Octree 之类的数据结构是什么。连续移动并且在搜索+更新方面不会比 3d 情
你好,有人用 C++ 迭代实现了 Kd-Tree 吗?我试过了,但是当节点数为奇数时它失败了。到目前为止,这是我的代码。我指的是 http://ldots.org/kdtree/#buildingAk
我想扩展一个 kd-tree (2D) 类,以便能够删除节点(点)。这种移除应该在不必重建树的大部分的情况下进行。这些slides中描述的算法,在幻灯片 13 上似乎是我所追求的。但是,我无法理解幻灯
普通的kd-tree是通过递归地将超平面分成两半来构建的。并且用一个查询点做范围搜索,它只会搜索一小串点(对数)而不是所有(线性)。 我想知道 kd 树可以用点积构建吗? 例如,b 是一个 3d 向量
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我刚刚完成了一个 kd-tree 的实现用于进行快速最近邻搜索。除了 Euclidean distance 之外,我有兴趣使用不同的距离指标。 .我对 kd-tree 的理解是,如果度量是非欧几里德的
我使用了 kd-tree algoritham 和 make tree。 但是我发现树不平衡所以我的问题是如果我们使用 kd-tree algoritham 那棵树总是平衡的如果不是那么我们怎样才能使
我是一名优秀的程序员,十分优秀!