Thanks, I will take that factor of 100 anytime rather than keep some syntactic familiarity from other languages.
Not to say I don't ever use loops, but I always try to vectorize the inner loop, if not the inner two loops. --------------------------------------------------------------------------- Jeff Newmiller The ..... ..... Go Live... DCN:<jdnew...@dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... Live: OO#.. Dead: OO#.. Playing Research Engineer (Solar/Batteries O.O#. #.O#. with /Software/Embedded Controllers) .OO#. .OO#. rocks...1k --------------------------------------------------------------------------- Sent from my phone. Please excuse my brevity. Petr PIKAL <petr.pi...@precheza.cz> wrote: >Hi > >> >> For loops are really, really slow in R. In general, you want to avoid > >them > >I strongly disagree. ***Proper*** use of looping is quite convenient >and >reasonably fast. > >Consider > >> system.time( { >+ a=0 >+ for (i in 1:10000000) { >+ a <-a+i >+ } >+ a >+ }) > user system elapsed > 10.22 0.02 10.28 >> >> system.time(b<-sum(as.numeric(1:10000000))) > user system elapsed > 0.09 0.01 0.11 >> identical(a,b) >[1] TRUE > >It is usually implementing C habits into R code what makes looping >slow. >The slowest part of a program is usually programming and it is >influenced >mainly by programmer. > >Regards >Petr > >> like the plague. If you absolutely must insist on using them in >large, >> computationally intense and complex code, consider implementing the >relevant >> parts in C, say, and calling that from R. >> >> Staying within R, you can probably considerably speed up that code by >> storing gx and gy as a multi-dimensional arrays. (e.g. for sample >data, >> something like >> >> rawGy = sample( 1:240, 240^2* 241, replace = T) >> rawGx = sample( 1:240, 240^2 *241, replace = T) >> gx = array(rawGx, dim = c(length(s) - 1, 240, max(rawGx)+1 ) ) >> gy = array(rawGy, dim = c(length(s) - 1, 240, max(rawGy)+1 ) ) >> >> ), in which case, you can easily do the computation without loops by >> >> gxa = (gx[ ,a,1]+ 1) >> gya =(gy[ ,a, 1] +1) >> uv = gx[cbind(1:(length(s) - 1) , b, gxa)] / gx[cbind(1:(length(s) - >1) >, a, >> gxa)] - gy[cbind(1:(length(s) - 1) ,b, gya)]/gy[cbind(1:(length(s) - >1) >,a, >> gya)] >> >> or similar, which will be enormously faster (on my computer, there's >an >over >> 30x speed up). With a bit of thought, I'm sure you can also figure >out >how >> to let it vectorise in a, as well... >> >> Zhou >> >> -- >> View this message in context: http://r.789695.n4.nabble.com/For- >> calculation-is-so-slow-tp4630830p4630855.html >> Sent from the R help mailing list archive at Nabble.com. >> >> ______________________________________________ >> 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. ______________________________________________ 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.