[R] Another loop - deloop question

Talbot Katz topkatz at msn.com
Mon Feb 5 17:31:26 CET 2007


Thank you so much!  This is super helpful, even if it turns out that 
vectorization doesn't improve performance in my situation.

--  TMK  --
212-460-5430	home
917-656-5351	cell



>From: "Charles C. Berry" <cberry at tajo.ucsd.edu>
>To: Talbot Katz <topkatz at msn.com>
>CC: r-help at stat.math.ethz.ch
>Subject: Re: [R] Another loop - deloop question
>Date: Fri, 2 Feb 2007 17:04:22 -0800
>
>
>Talbot,
>
>Vectorization is not panacea.
>
>For n == 100, m ==1000:
>
>>system.time( for( i in 1:n ){ p[ g[[i]] ] <- p[ g[[i]] ] + y[[i]] })
>[1]  0  0  0 NA NA
>>system.time( p2 <- tapply( unlist(y), unlist(g), sum ))
>[1] 0.16 0.00 0.16   NA   NA
>>all.equal(p,as.vector(p2))
>[1] TRUE
>>system.time( p3 <- xtabs( unlist(y) ~ unlist(g) ) )
>[1] 0.08 0.00 0.08   NA   NA
>>all.equal(p,as.vector(p3))
>[1] TRUE
>>system.time( p4 <- unlist(y) %*% diag(m)[ unlist(g), ] )
>[1] 4.16 0.20 4.36   NA   NA
>>all.equal(p,as.vector(p4))
>[1] TRUE
>
>
>Vectorization has had no victory, Grasshopper.
>
>---
>
>For n == 10000, m == 10, the slowest method above becomes the fastest, and 
>the fastest above becomes the slowest. So, you need to consider the 
>applications to which you will apply this.
>
>Read up on profiling if you really 'feel the need for speed'. (Writing R 
>Extensions 3.2 Profiling R code for speed.)
>
>Chuck
>
>p.s. Please read "Writing R Extensions 3.1 Tidying R code" and follow the 
>wisdom therein.
>
>
>On Fri, 2 Feb 2007, Talbot Katz wrote:
>
>>Hi.
>>
>>You folks are so clever, I thought perhaps you could help me make another
>>procedure more efficient.
>>
>>Right now I have the following setup:
>>
>>p is a vector of length m
>>g is a list of length n, g[[i]] is a vector whose elements are indices of 
>>p,
>>i.e., integers between 1 and m inclusive); the g[[i]] cover the full set
>>1:m, but they don't have to constitute an exact partition, theycan overlap
>>members.
>>y is another list of length n, each y[[i]] is a vector of the same length 
>>as
>>g[[i]].
>>
>>Now I build up the vector p as follows:
>>
>>p=rep(0,m)
>>for(i in 1:n){p[g[[i]]]=p[g[[i]]]+y[[i]]}
>>
>>Can this loop be vectorized?
>>
>>Thanks!
>>
>>--  TMK  --
>>212-460-5430	home
>>917-656-5351	cell
>>
>>______________________________________________
>>R-help at stat.math.ethz.ch 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.
>>
>
>Charles C. Berry                        (858) 534-2098
>                                          Dept of Family/Preventive 
>Medicine
>E mailto:cberry at tajo.ucsd.edu	         UC San Diego
>http://biostat.ucsd.edu/~cberry/         La Jolla, San Diego 92093-0901
>
>



More information about the R-help mailing list