[R] Corrected: approaches to matrix multiplication of each layer of 3-d array with different matrix
Jeff Newmiller
jdnewmil at dcn.davis.CA.us
Fri Jul 10 19:06:54 CEST 2015
EE[,,1] <- A[,,1] %*% B[,,1]
EE[,,2] <- A[,,2] %*% B[,,2]
EE[,,3] <- A[,,3] %*% B[,,3]
etc.
---------------------------------------------------------------------------
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 8:37:37 AM PDT, Ranjan Maitra <maitra.mbox.ignored at inbox.com> wrote:
>What does it mean to unroll the loop?
>
>Thanks!
>
>Ranjan
>
>
>On Fri, 10 Jul 2015 07:07:15 -0700 Jeff Newmiller
><jdnewmil at dcn.davis.ca.us> wrote:
>
>> 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.
>> >>
>>
>> ______________________________________________
>> 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