r - 矢量化思维

标签 r vector vectorization

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

最佳答案

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

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 。)

关于r - 矢量化思维,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30904455/

相关文章:

r - 整个数据集的回归线,以及基于R ggplot2中基于组的回归线?

r - 将\in(是集合的成员)符号添加到qplot中

c++ - 将 vector<double> 写入二进制文件并再次读取

java - 比较和删除 vector 中的相似字符串

python - 使用 Python/NumPy 对图像阈值进行矢量化

r - 如何删除 usmap 图中的边框

从 R 中的库效果中删除图​​中第 3 轴和第 4 轴上的刻度

c++ - std::vector push_back 上的段错误/"Vector is not dereferencable"

algorithm - 从 MATLAB 中的聚类算法中删除 for 循环

c++ - 如何让 Visual C++ 向量化此循环(错误代码 1200)?