首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量化思维

向量化思维
EN

Stack Overflow用户
提问于 2015-06-18 00:05:33
回答 2查看 139关注 0票数 2

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-18 00:26:43

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

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2015-06-18 18:32:04

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

代码语言:javascript
复制
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为例。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30904455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档