我有2个数字向量,一个存储值以计算最大值,滚动窗口的另一个长度用于计算滚动窗口的最大值。下面是一些示例代码。一般来说,我正在尝试加速system.time中的代码。是否有一些现成功能或矢量化方式来做同样的事情?
a <- rep(1:5,20000)
set.seed(123)
b <- rep(sample(1:50),2000)
system.time({
out <- vector(mode='numeric', length=NROW(a))
for(i in seq(a)) {
if (i-b[i]>=0) out[i] <- max(a[(i-b[i]+1):i])
else out[i] <- NA
}
})
答案 0 :(得分:1)
管理它的部分内容:
原创 -
system.time({
out <- vector(mode='numeric', length=NROW(a))
for(i in seq(a)) {
if (i-b[i]>=0) out[i] <- max(a[(i-b[i]+1):i])
else out[i] <- NA
}
})
## user system elapsed
## 0.64 0.00 0.64
稍微向量化 -
system.time({
nr <- NROW(a)
out <- rep(NA,nr)
m <- 1:nr - b + 1
n <- (1:nr)[m>0]
for(i in n)
out[i] <- max(a[m[i]:i])
})
## user system elapsed
## 0.39 0.00 0.39
答案 1 :(得分:0)
您可以将此问题的部分向量化,尤其是需要在a
(我称之为str
)和窗口末尾({{1})中查找起始索引位置的位置。 }),但我必须使用循环结构将这些索引位置应用到end
以使用a
获取max
。像这样:
mapply
与@ e4e5f4的答案相比:
x <- seq_len( length(a) )
end <- which( x-b > 0 )
str <- end - b[end]
res <- a
res[ - end ] <- NA
res[end] <- mapply( function(x,y) max( a[ x:y ] ) , str , end )
然而,它并非完全:
identical( res , out )
[1] TRUE
如果有办法对最后一次操作进行矢量化,那么这将非常快,但我现在想不出任何方法可以做到这一点!