Gents:

Well... (munch munch) I do think I must eat my words:

>z <- lapply(seq_len(1e6),function(x)matrix(runif(100),nr=10))

> system.time(Reduce("+",z)/length(z))
   user  system elapsed
   3.48    0.05    3.52
> system.time(rowMeans(array(unlist(z),dim=c(10,10,length(z))),dims=2))
   user  system elapsed
   5.09    0.53    5.65

At the very least the two are competitive, and in these sorts of data
(large list of small matrices) Reduce(0 may be slightly faster.

I leave it to those who are curious to check out other scenarios.

Cheers,
Bert


On Mon, Nov 5, 2012 at 7:12 AM, Bert Gunter <bgun...@gene.com> wrote:
> Gents:
>
> Although it is difficult to say what may be faster, as it typically
> depends on the data,  and it is even more difficult to say what is
> fast enough, I suspect that
>
> ?rowMeans ## specifically written for speed
>
> would be considerably faster than Reduce (or an apply() )approach on
> the array), but I have **not** checked. I am of course prepared to eat
> my words in the face of data to the contrary.
>
> The call would be:
>
> result <- rowMeans( array(unlist(raw), dim = c(r,s,length(raw)), dims=2)
>
> Note that rowMeans() has an na.rm arguments to handle NA's. See the
> help file for deatils.
> Note also the tradeoff to memory, as copies of raw probably are made
> during evaluation.
> Finally note that dimnames are lost in the final result, so the above
> would have to be followed by
>
> dimnames(result) <- dimnames(raw[[1]])
>
> to get them back.
>
> -- Bert
>
>
> On Mon, Nov 5, 2012 at 2:43 AM, D. Rizopoulos <d.rizopou...@erasmusmc.nl> 
> wrote:
>> If you don't have any NAs, then one way is:
>>
>> n <- 3
>> r <- 5
>> s <- 6
>> raw <- lapply(seq_len(n), function(i){
>>    matrix(rnorm(r * s), ncol = r)
>> })
>>
>> Reduce("+", raw) / length(raw)
>>
>>
>> I hope it helps.
>>
>> Best,
>> Dimitris
>>
>>
>> On 11/5/2012 11:32 AM, ONKELINX, Thierry wrote:
>>> Dear all,
>>>
>>> I have a list of n matrices which all have the same dimension (r x s). What 
>>> would be a fast/elegant way to calculate the element wise average? So 
>>> result[1, 1] <- mean(c(raw[[1]][1, 1] , raw[[2]][1, 1], raw[[...]][1, 1], 
>>> raw[[n]][1, 1]))
>>>
>>> Here is my attempt.
>>>
>>> #create a dummy dataset
>>> n <- 3
>>> r <- 5
>>> s <- 6
>>> raw <- lapply(seq_len(n), function(i){
>>>    matrix(rnorm(r * s), ncol = r)
>>> })
>>>
>>> #do the calculation
>>> result <- array(dim = c(dim(raw[[1]]), length(raw)))
>>> for(i in seq_along(raw)){
>>>    result[,,i] <- raw[[i]]
>>> }
>>> result <- apply(result, 1:2, mean)
>>>
>>>
>>> Best regards,
>>>
>>> Thierry
>>>
>>> ir. Thierry Onkelinx
>>> Instituut voor natuur- en bosonderzoek / Research Institute for Nature and 
>>> Forest
>>> team Biometrie & Kwaliteitszorg / team Biometrics & Quality Assurance
>>> Kliniekstraat 25
>>> 1070 Anderlecht
>>> Belgium
>>> + 32 2 525 02 51
>>> + 32 54 43 61 85
>>> thierry.onkel...@inbo.be
>>> www.inbo.be
>>>
>>> To call in the statistician after the experiment is done may be no more 
>>> than asking him to perform a post-mortem examination: he may be able to say 
>>> what the experiment died of.
>>> ~ Sir Ronald Aylmer Fisher
>>>
>>> The plural of anecdote is not data.
>>> ~ Roger Brinner
>>>
>>> The combination of some data and an aching desire for an answer does not 
>>> ensure that a reasonable answer can be extracted from a given body of data.
>>> ~ John Tukey
>>>
>>> * * * * * * * * * * * * * D I S C L A I M E R * * * * * * * * * * * * *
>>> Dit bericht en eventuele bijlagen geven enkel de visie van de schrijver 
>>> weer en binden het INBO onder geen enkel beding, zolang dit bericht niet 
>>> bevestigd is door een geldig ondertekend document.
>>> The views expressed in this message and any annex are purely those of the 
>>> writer and may not be regarded as stating an official position of INBO, as 
>>> long as the message is not confirmed by a duly signed document.
>>>
>>> ______________________________________________
>>> 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.
>>>
>>
>> --
>> Dimitris Rizopoulos
>> Assistant Professor
>> Department of Biostatistics
>> Erasmus University Medical Center
>>
>> Address: PO Box 2040, 3000 CA Rotterdam, the Netherlands
>> Tel: +31/(0)10/7043478
>> Fax: +31/(0)10/7043014
>> Web: http://www.erasmusmc.nl/biostatistiek/
>> ______________________________________________
>> 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.
>
>
>
> --
>
> Bert Gunter
> Genentech Nonclinical Biostatistics
>
> Internal Contact Info:
> Phone: 467-7374
> Website:
> http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm



-- 

Bert Gunter
Genentech Nonclinical Biostatistics

Internal Contact Info:
Phone: 467-7374
Website:
http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm

______________________________________________
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.

Reply via email to