【问题标题】:replacing a for-loop替换for循环
【发布时间】:2023-11-17 03:29:01
【问题描述】:

我想找到一种方法来替换我正在使用的 for 循环。我的问题的快速版本是: 如何从向量 [a,b,c,d,e] 转到 [1,a,a*b,a*b*c,a*b*c*d] ? 我目前正在做类似的事情:

myvec <- c(.3,.5,.2,.3,.3)  
new_vec <- vector(length=length(myvec))  
new_vec[1] <- 1  
for (i in 2:length(myvec)) {  
    new_vec[i] <- myvec[i-1]*new_vec[i-1]  
}  

但是,这非常慢。有任何想法吗? 谢谢!

【问题讨论】:

    标签: r for-loop vectorization performance


    【解决方案1】:

    这是你想要的吗?

    c(1, cumprod(myvec))[1:length(myvec)]
    

    【讨论】:

    • 嗨 Andreas,这正是我想要的。非常感谢!
    • 你知道我怎么能看到cumprod的源代码吗?我猜它是用 C 写的?
    • 是的,它是用 C 编写的。我在这里找到了一个旧版本的源代码:google.com/codesearch#ETHLt0MjEm8/mirrors/Linux/Guadalinex/… 但它实际上只是一个累积产品。
    • 好的,谢谢。更多的是出于好奇。一直想看.Primitive的函数源码,一直没花时间问。
    • 可能不会比 for 循环快,但更高级别的抽象在其他情况下可能有用Reduce("*", c(1, c(.3,.5,.2,.3,.3) ), accumulate=T)