Thierry:

(Apologies for beating a dead horse ...)

Just wanted to point out that sometimes it does not pay to try to be clever:

Try the **obvious, simple** solution using a for loop (where z is your
list of matrices):
> z1 <- 0
> for(i in seq_len(1e6))z1<- z1+z[[i]]
> z1<- z1/length(z)})

This was just about as fast as the more elegant Reduce() solution when
I tried it on my previous example of a million 10x10 matrices. (Note
that your OS and memory may affect this).

-- Bert





On Tue, Nov 6, 2012 at 5:45 AM, ONKELINX, Thierry
<thierry.onkel...@inbo.be> wrote:
> Dear all,
>
> Thanks a lot for your suggestions.
>
> Arun's suggestion of using simplify2array is only marginally faster than my 
> attempt.
> The solutions of Dimitris and Bert however were 78 and 30 times faster than 
> my attempt (using n = 51, s = 25, r = 1000 what will be about their size in 
> my application).
>
> As there shouldn't be any missing data in the array, I'll stick to the 
> solution based on Reduce() because I find it as well fast as elegant.
>
> Best regards,
>
> 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
>
> -----Oorspronkelijk bericht-----
> Van: Bert Gunter [mailto:gunter.ber...@gene.com]
> Verzonden: maandag 5 november 2012 16:13
> Aan: D. Rizopoulos
> CC: ONKELINX, Thierry; r-help@r-project.org
> Onderwerp: Re: [R] averaging a list of matrices element wise
>
> 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
> * * * * * * * * * * * * * 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.



-- 

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