[R] Is it possible to vectorize/accelerate this?

Dennis Murphy djmuser at gmail.com
Thu Nov 3 21:22:50 CET 2011


Hi:

You're doing the right thing in R by pre-allocating memory for the
result, but ifelse() is a vectorized function and your loop is
operating elementwise, so if-else is more appropriate. Try

for (i in 2:100){
    b_vec[i] <- if(abs(b_vec[i-1] + a_vec[i]) > 1) a_vec[i] else
b_vec[i-1] + a_vec[i]
  }

If speed is an issue, then I echo Michael's suggestion to write a
C(++) function and call it within R. The inline package is good for
this kind of thing.

HTH,
Dennis


On Thu, Nov 3, 2011 at 12:10 PM, hihi <v.p.mail at freemail.hu> wrote:
> Dear Members,
>
> I work on a simulaton experiment but it has an bottleneck. It's quite fast because of R and vectorizing, but it has a very slow for loop. The adjacent element of a vector (in terms of index number) depends conditionally on the former value of itself. Like a simple cumulating function (eg. cumsum) but with condition. Let's show me an example:
> a_vec = rnorm(100)
> b_vec = rep(0, 100)
> b_vec[1]=a_vec[1]
> for (i in 2:100){b_vec[i]=ifelse(abs(b_vec[i-1]+a_vec[i])>1, a_vec[i], b_vec[i-1]+a_vec[i])}
> print(b_vec)
>
> (The behaviour is like cumsum's, but when the value would excess 1.0 then it has another value from a_vec.)
> Is it possible to make this faster? I experienced that my way is even slower than in Excel! Programming in C would my last try...
> Any suggestions?
>
> Than you,
> Peter
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list