我正在使用kd-tree算法(在此处找到)来查找矩阵1中某个点相对于矩阵2中所有点的最近邻。上述算法非常快,能够在大约20秒内找到300万个最近邻。
nn2(SetA,SetB,k=1)
现在,我只想包括在彼此一定半径内的最近邻,所以我尝试使用以下代码:
nn2(SetA,SetB,k=1,searchtype='radius',radius=1000)
这种方法虽然有效,但会使计算速度变得极其缓慢,实际上可能会慢几个数量级(1000倍或更多)。我不明白为什么会出现这种情况,因为在我的理解中,最大半径实际上应该可以减少计算时间,因为不需要扫描整个空间。
有人能解释一下是怎么回事吗?或者为什么会出现这种情况?
以下是可重现此问题的示例代码:
library(data.table)
library(RANN)
N=50000
DT1=data.table(x=sample(0:300,N,replace=T),y=sample(301:600,N,replace=T))
DT2=data.table(x=sample(0:300,N,replace=T),y=sample(301:600,N,replace=T))
ptm=proc.time()
nnlistV1=nn2(DT1,DT2,k=1)
proc.time()-ptm
ptm=proc.time()
nnlistV2=nn2(DT1,DT2,k=1,searchtype="radius",radius=20)
proc.time()-ptm
nn2
使用了一种低效的算法。我的建议是查看定义nn2
的源文件rbind.R
,并对复杂度进行分析。 - user2210287