矢量化思维

时间:2015-06-18 00:05:34

标签: r vector vectorization

我遇到了矢量化问题。假设我有一个向量x <- c(0,0,1,0,1,1,0),我想要的是获取向量(1,0,1,1),或者从第一个点到第一个非零点去除所有0以及从最后一个去除所有0到最后一个点的非零点。它在正常情况下很容易,但棘手的部分是我不能使用任何循环(for,while等)。基本上,我必须“矢量化”整个算法。有人帮忙吗?

2 个答案:

答案 0 :(得分:3)

好吧,如果速度是一个问题,只需使用循环:

x <- rpois(1e8,1)
# Zihu Guo & JacobH's answer
system.time({zeros <- which(x > 0); x[zeros[1]:tail(zeros, n = 1)]})
#    user  system elapsed 
#    1.46    0.42    1.89 

# a slightly improved version of their answer
system.time({zeros <- which(!!x); x[zeros[1]:tail(zeros, n = 1)]})
#    user  system elapsed 
#    1.21    0.42    1.64 


system.time({
    lo  = 0L
    lov = 0L
    while (!lov){ lo = lo+1L ; lov = lov+x[lo] }
    hi  = length(x)+1L
    hiv = 0L
    while (!hiv){ hi = hi-1L ; hiv = hiv+x[hi] }    
    x[lo:hi]
})
#    user  system elapsed 
#    0.62    0.07    0.71 

除了速度之外,这很好,因为它不需要真正的R知识。可能会使用Rcpp包来加快速度。

(如果整个向量为零,则永远不会终止。如果重要,可以进行小的调整。如果向量大多数零,则which方法更快。例如,考虑x <- rep(0L,1e8); x[1e8/2] <- 1L。)

答案 1 :(得分:2)

我想你可以试试这个, 感谢@JacobH评论,这会更快。

x <- c(0,0,1,0,1,1,0)
zeros <- which(x > 0)

x[zeros[1]:tail(zeros, n = 1)]

输出

  

[1] 1 0 1 1