比较两个单调递增向量中的值

我有两个单调递增的向量,v1并且v2长度不等。对于每个值v1(例如v1[1], v1[2], ...),我想找到的价值v2,这只是小于v1[i]和计算的差异。

我当前的代码(见下文)工作正常,但似乎不能很好地扩展。所以我正在寻找建议来改进我的方法,要求留在 R 中,或者使用我可以从 R 调用的包。

示例代码:

v1 <- c(3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0)
v2 <- c(0, 2, 3.2, 4.6, 5.5, 7.1, 9.9, 12, 13)

myFunc <- function(x,v2) x - max(v2[x>=v2])
v3 <- sapply(as.list(v1), FUN = myFunc, v2)

cbind(v1,v3)

        v1  v3
 [1,]  3.0 1.0
 [2,]  3.5 0.3 # 0.3 = 3.5 - 3.2 where 3.5 is from v1[2] and 3.2 is v2[3]
 [3,]  4.0 0.8
 [4,]  4.5 1.3
 [5,]  5.0 0.4
 [6,]  5.5 0.0
 [7,]  6.0 0.5
 [8,]  6.5 1.0
 [9,]  7.0 1.5
[10,]  7.5 0.4
[11,]  8.0 0.9
[12,]  8.5 1.4
[13,]  9.0 1.9
[14,]  9.5 2.4
[15,] 10.0 0.1

基准 1:对于小向量,比如大约 10,000 个元素,代码将在 <1 秒内运行:

> v1 <- seq(3,5000,.5)
> v2 <- seq(2.2,5200,.52)
> 
> {
+   start <- Sys.time()
+   v3 <- sapply(as.list(v1), FUN = myFunc, v2)
+   Sys.time() - start
+ }
Time difference of 0.8118291 secs

基准 2:对于包含大约 100,000 个元素的向量,代码需要大约 60-80 秒。

> v1 <- seq(3,50000,.5)
> v2 <- seq(2.2,52000,.52)
> 
> {
+   start <- Sys.time()
+   v3 <- sapply(as.list(v1), FUN = myFunc, v2)
+   Sys.time() - start
+ }
Time difference of 1.098762 mins

所以重申一下,我正在寻找建议来改进我的方法,以满足留在 R 中的要求,或者使用我可以从 R 调用的包。

以上是比较两个单调递增向量中的值的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>