我有一个非常大的未排序向量 A 和一个已排序向量 B(相对较短)。
A = runif(n = 1e6)
B = seq(0,1,by = 1e-3)
现在给定一个“向前”或“向后”的方向,对于 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.93
有没有办法更快地做到这一点?
(保证 min(B)<min(A)
和 max(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
关于R快速方法为A中的每个元素找到向量B中最接近的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39367372/