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.m...@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@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. > ______________________________________________ R-help@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.