R为A中的每个元素找到向量B中最近值的快速方法
我有一个非常大的未排序向量a和一个排序向量B(相对较短) 现在给定一个方向“向前”或“向后”,对于a中的每个元素,找到B中具有该方向的最近元素。例如“前进”R为A中的每个元素找到向量B中最近值的快速方法,r,R,我有一个非常大的未排序向量a和一个排序向量B(相对较短) 现在给定一个方向“向前”或“向后”,对于a中的每个元素,找到B中具有该方向的最近元素。例如“前进” A2 = sapply(A, function(x) B[B>=x][1]) 给出了结果。但是,这太慢了,因为sapply在A上循环 > system.time(sapply(A, function(x) B[B>=x][1])) user system elapsed 17.93 0.00 17
A2 = sapply(A, function(x) B[B>=x][1])
给出了结果。但是,这太慢了,因为sapply
在A上循环
> system.time(sapply(A, function(x) B[B>=x][1]))
user system elapsed
17.93 0.00 17.93
有没有一种方法可以更快地做到这一点
(保证
min(B)max(A)
,如果有用)函数findInterval
使用二进制搜索解决了这个确切的问题。试试这个:
B[findInterval(A,B)+1]
比较:
set.seed(44)
A <- runif(n = 1e6)
B <- seq(0,1,by = 1e-3)
system.time(A2<-sapply(A, function(x) B[B>=x][1]))
# user system elapsed
# 18.058 0.000 15.606
system.time(A3<-B[findInterval(A,B)+1])
# user system elapsed
# 0.00 0.00 0.07
identical(A2,A3)
#[1] TRUE
set.seed(44)
A.
set.seed(44)
A <- runif(n = 1e6)
B <- seq(0,1,by = 1e-3)
system.time(A2<-sapply(A, function(x) B[B>=x][1]))
# user system elapsed
# 18.058 0.000 15.606
system.time(A3<-B[findInterval(A,B)+1])
# user system elapsed
# 0.00 0.00 0.07
identical(A2,A3)
#[1] TRUE