[R] Corrected: approaches tpmatrix multiplication of each layer of 3-d array with different matrix

Jeff Newmiller jdnewmil at dcn.davis.CA.us
Fri Jul 10 16:07:15 CEST 2015


Strictly speaking, the answer is yes because you can unroll the loop, but that probably is not what you really want or need to do.

Your example seems about right, but it is not clear how you plan to make 44 conform with 5500.
---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<jdnewmil at 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.

On July 10, 2015 6:44:19 AM PDT, Ranjan Maitra <maitra.mbox.ignored at inbox.com> wrote:
>Hi,
>
>Sorry to post again, but there is a careless error in my first R code
>snippet:
>
>--- begin R code ---
> 
>AA <- array(1:60, dim = c(5500,44,33))
>BB <- array(1:60, dim = c(44,44,33))
> 
> 
>arraymatprod <- function(A, B) {
>    EE <- array(dim=dim(A));
>    for (i in 1:dim(A)[3]) EE[,,i] <- A[,,i] %*% B[,,i]
>    EE
>}
>
>system.time(arraymatprod(AA, BB))
>
>--- end R code ---
>
>The second snippet is correct:
>
>--- begin R code ---
>
>arraymatrixproduct <- function(A, B) {
>	require(abind)
>	dA <- dim(A)[1]
>	AB <- abind(A, B, along = 1)
>	array(apply(X = AB, MARGIN = 3, FUN = (function(mat) ((mat[1:dA, ] %*%
>mat[(dA+1):(dim(AB)[1]),])))), dim = dim(A))
>}
>
>system.time(arraymatrixproduct(AA, BB))
>
>--- end R code ---
>
>However, the second is almost twice as long as the first snippet.
>
>Many thanks,
>Ranjan
>
>
>On Fri, 10 Jul 2015 08:23:49 -0500 Ranjan Maitra
><maitra.mbox.ignored at inbox.com> wrote:
>
>> Dear friends,
>> 
>> I have two 3-d arrays of appropriate dimensions. I want to
>postmultiply the 2-D matrix layers of the first with the 2-D matrix
>layers of the second. Can I do this easily in R avoiding loops?
>> 
>> As an example:
>> 
>> --- begin R code ---
>> 
>> AA <- array(1:60, dim = c(5500,44,33))
>> BB <- array(1:60, dim = c(44,44,33))
>> 
>> 
>> arraymatprod <- function(A, B) {
>>     EE <- array(dim=dim(A));
>>     for (i in 1:3) EE[,,i] <- A[,,i] %*% B[,,i]
>>     EE
>> }
>> 
>> system.time(arraymatprod(AA, BB))
>> 
>> --- end R code ---
>> 
>> So, is there a way to do this without the loop?
>> 
>> Of course, I could abind the arrays and then use apply with an
>appropriate function which would be as follows:
>> 
>> --- begin R code ---
>> 
>> arraymatrixproduct <- function(A, B) {
>> 	require(abind)
>> 	dA <- dim(A)[1]
>> 	AB <- abind(A, B, along = 1)
>> 	array(apply(X = AB, MARGIN = 3, FUN = (function(mat) ((mat[1:dA, ]
>%*% mat[(dA+1):(dim(AB)[1]),])))), dim = dim(A))
>> }
>> 
>> system.time(arraymatrixproduct(AA, BB))
>> 
>> --- end R code ---
>> 
>> However, this turns out to be slower -- perhaps because of the use of
>abind and filling the array inside the function.
>> 
>> I just wanted suggestions to get this operation done more
>efficiently.
>> 
>> Many thanks and best wishes,
>> Ranjan
>> 
>> ____________________________________________________________
>> Publish your photos in seconds for FREE
>> TRY IM TOOLPACK at http://www.imtoolpack.com/default.aspx?rc=if4
>> 
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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.
>>



More information about the R-help mailing list