[R] multiplying a matrix by a vector

peter dalgaard pdalgd at gmail.com
Fri Nov 4 17:35:32 CET 2016


Notice though, that Bert loses (or _should_ lose) for larger values of N, since that method involves O(N^3) operations whereas the other two are O(N^2). I am a bit surprised that sweep() is so inefficient even at N=1000.

-pd


On 04 Nov 2016, at 16:41 , Jeff Newmiller <jdnewmil at dcn.davis.ca.us> wrote:

> Sara wins on memory use.
> 
> Rui wins on speed.
> 
> Bert wins on clarity.
> 
> library(microbenchmark)
> 
> N <- 1000
> x <- matrix( runif( N*N ), ncol=N )
> y <- seq.int( N )
> 
> microbenchmark( { t( y * t(x) ) }
>              , { x %*% diag( y ) }
>              , { sweep( x, 2, y, `*` ) }
>              )
> Unit: milliseconds
>                        expr       min        lq    median        uq      max neval
>         {     t(y * t(x)) }  6.659562  7.475414  7.871341  8.182623 47.01105 100
>       {     x %*% diag(y) }  9.859292 11.014021 11.281334 11.733825 48.79463 100
> {     sweep(x, 2, y, `*`) } 16.535938 17.682175 18.283572 18.712342 55.47159 100
> 
> On Fri, 4 Nov 2016, Dimitri Liakhovitski wrote:
> 
>> Nice!
>> Thanks a lot, everybody!
>> Dimitri
>> 
>> On Fri, Nov 4, 2016 at 10:35 AM, Bert Gunter <bgunter.4567 at gmail.com> wrote:
>>> My goodness!
>>> 
>>>> x %*% diag(y)
>>> 
>>>     [,1] [,2]
>>> [1,]    2   12
>>> [2,]    4   15
>>> [3,]    6   18
>>> 
>>> will do.
>>> 
>>> -- Bert
>>> 
>>> 
>>> 
>>> Bert Gunter
>>> 
>>> "The trouble with having an open mind is that people keep coming along
>>> and sticking things into it."
>>> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )
>>> 
>>> 
>>> On Thu, Nov 3, 2016 at 2:33 PM, Sarah Goslee <sarah.goslee at gmail.com> wrote:
>>>> Like this?
>>>> 
>>>>> sweep(x, 2, y, "*")
>>>>     [,1] [,2]
>>>> [1,]    2   12
>>>> [2,]    4   15
>>>> [3,]    6   18
>>>>> 
>>>> 
>>>> 
>>>> On Thu, Nov 3, 2016 at 5:05 PM, Dimitri Liakhovitski
>>>> <dimitri.liakhovitski at gmail.com> wrote:
>>>>> Hello!
>>>>> 
>>>>> I have a matrix x and a vector y:
>>>>> 
>>>>> x <- matrix(1:6, ncol = 2)
>>>>> y <- c(2,3)
>>>>> 
>>>>> I need to multiply the first column of x by 2 (y[1]) and the second
>>>>> column of x by 3 (y[2]).
>>>>> 
>>>>> Of course, I could do this - but it's column by column:
>>>>> 
>>>>> x[,1] <- x[,1] * y[1]
>>>>> x[,2] <- x[,2] * y[2]
>>>>> x
>>>>> 
>>>>> Or I could repeat each element of y and multiply two matrices - that's better:
>>>>> 
>>>>> rep.row<-function(x,n){
>>>>>  matrix(rep(x,each=n),nrow=n)
>>>>> }
>>>>> y <- rep.row(y, nrow(x))
>>>>> x * y
>>>>> 
>>>>> However, maybe there is a more elegant r-like way of doing it?
>>>>> Thank you!
>>>>> 
>>>>> --
>>>>> Dimitri Liakhovitski
>>>>> 
>>>> 
>>>> --
>>>> Sarah Goslee
>>>> http://www.functionaldiversity.org
>>>> 
>>>> ______________________________________________
>>>> 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.
>> 
>> 
>> 
>> -- 
>> Dimitri Liakhovitski
>> 
>> ______________________________________________
>> 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.
>> 
> 
> ---------------------------------------------------------------------------
> 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
> 
> ______________________________________________
> 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.

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Office: A 4.23
Email: pd.mes at cbs.dk  Priv: PDalgd at gmail.com



More information about the R-help mailing list