【问题标题】:Is there a way to vectorize operations that access multiple elements of a vector?有没有办法对访问向量的多个元素的操作进行向量化?
【发布时间】:2012-12-06 10:23:21
【问题描述】:

假设我有一个整数向量:

> a<-sample(1:100,10)  
> a  
 [1] 13 23 97 70 63 32 82 31 15 36  

我想要一个包含该向量的累积值的向量。也就是说,我想要向量
13 36 133 203 266 298 380 411 426 462

实现此目的的一种方法是使用 for 循环。我更喜欢使用 apply/lapply/sapply/...,但我能想到的唯一方法是:

sapply(1:length(a), function(x) {sum(a[1:x])})
[1]  13  36 133 203 266 298 380 411 426 462

这可行,但我想知道是否有更好的方法来做到这一点。有吗?
(这可能是一个不好的例子,但总的来说,如果您知道这些元素相对于当前元素的位置,有没有办法访问被迭代列表的元素?)

【问题讨论】:

    标签: r loops vectorization


    【解决方案1】:

    你可能会傻笑,但是已经有一个内置函数可以解决这个问题,请参阅 ?cumsum

    x <- sample(1:100,20)
    x
    
     [1] 32 42 54 79 92 69 96 41 51 22 74 76 86 37 85 99  3 11 17 57
    
    cumsum(x)
    
     [1]   32   74  128  207  299  368  464  505  556  578  652  728  814  851  936
    [16] 1035 1038 1049 1066 1123
    

    【讨论】:

    • 不会推荐它而不是 cumsum,但 Reduce('+', a, accumulate = TRUE) 会做到这一点,并且可以推广到其他二元运算符。
    • 不会推荐它而不是 cumsum,但 filter(a, 1, "recursive") 可以解决问题,并且可以推广到其他递归关系。
    • @commenters,我看到了这些其他功能。但是 cumsum 是一个原始的,那是不是意味着它应该是最快的实现?
    • @Brandon 我没有检查过,但我认为你是正确的。以我的经验,Reduce 很漂亮,但没那么快。
    • @Brandon,毫无疑问。但我认为(并假设@Tyler 也是如此)因为这些替代方案更通用,所以在考虑更广泛的问题时提及它们会很高兴 是否有办法对访问向量的多个元素的操作进行向量化?
    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多