我有一个数据集,可以在3D模式下运行数百万个数据点。对于我正在进行的计算,我需要计算半径中每个数据点的邻居(范围搜索),尝试拟合函数,计算拟合误差,对下一个数据点重复此操作,依此类推。我的代码可以正常工作,但是运行时间很长,每个数据点大约需要1秒!可能是因为每个点都必须在整个数据集中进行搜索。有没有一种方法可以使该过程更快。我有一个想法,如果我能以某种方式在第一个邻居之间建立某种邻接关系,那么这可能会比较慢。如果有帮助,我试图在3D中找到最佳的Parzen窗口宽度。
我有一个数据集,可以在3D模式下运行数百万个数据点。对于我正在进行的计算,我需要计算半径中每个数据点的邻居(范围搜索),尝试拟合函数,计算拟合误差,对下一个数据点重复此操作,依此类推。我的代码可以正常工作,但是运行时间很长,每个数据点大约需要1秒!可能是因为每个点都必须在整个数据集中进行搜索。有没有一种方法可以使该过程更快。我有一个想法,如果我能以某种方式在第一个邻居之间建立某种邻接关系,那么这可能会比较慢。如果有帮助,我试图在3D中找到最佳的Parzen窗口宽度。
Answers:
这与分子动力学领域的最大挑战之一非常相似-计算非键合颗粒之间的所有成对相互作用。
在这里,我们使用单元格列表(或邻居列表)来帮助我们找出附近的事物。对于此应用程序,单元格列表可能是更易于使用的算法:
如果您的系统具有或多或少均匀的粒子分布,则根据网格的粗糙度,这将大大降低算法的成本。但是,必须进行一些微调:网格太粗,您将不会节省太多时间;太好了,您将花费大量时间在空的网格单元上循环!