[R] multiplying a matrix by a vector

Bert Gunter bgunter.4567 at gmail.com
Fri Nov 4 19:49:08 CET 2016


Berend, et. al.:

"I don't quite understand why I get a very different ranking."

Nor do I. But, as Peter noted, my matrix multiplication solution
"should" be worst in terms of efficiency, and it clearly is. The other
two *should* be "similar", and they are. So your results are
consistent with what one should expect, whereas, as Peter noted,
Jeff's are not.

But as we all know, *actual* efficiency in use can be tricky to
determine (asymptopia is always questionable), as it may depend on
state, problem details, exact algorithms in use, etc. Which is why the
standard first principle in code optimization is: don't.

Cheers,
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 Fri, Nov 4, 2016 at 11:27 AM, Berend Hasselman <bhh at xs4all.nl> wrote:
>
>> On 4 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
>
>
> I get different results with R3.2.2 on Mac OS X (using reference BLAS).
>
>
> library(rbenchmark)
>
> N <- 1000
> x <- matrix( runif( N*N ), ncol=N )
> y <- seq.int( N )
>
> benchmark(  t( y * t(x) ), x %*% diag( y ), sweep( x, 2, y, `*` ) ,
>            columns=c("test","elapsed","relative"), replications=10
>          )
>
> #                  test elapsed relative
> # 3 sweep(x, 2, y, `*`)   0.132    1.000
> # 1         t(y * t(x))   0.189    1.432
> # 2       x %*% diag(y)   7.928   60.061
>
> library(microbenchmark)
> microbenchmark( { t( y * t(x) ) }
>              , { x %*% diag( y ) }
>              , { sweep( x, 2, y, `*` ) },
>              times=10, unit="s"
>              )
>
> # Unit: seconds
> #                         expr        min         lq       mean     median uq        max neval cld
> #          {     t(y * t(x)) } 0.01099410 0.01132096 0.01597058 0.01332414  0.01430672 0.04447432    10  a
> #        {     x %*% diag(y) } 0.76588887 0.78581717 0.79878255 0.79811626  0.80607877 0.82903945    10   b
> #  {     sweep(x, 2, y, `*`) } 0.01177478 0.01246777 0.01409457 0.01314718   0.01600818 0.01802171    10  a
>
>
> sweep appears to very good.
>
> I don't quite understand why I get a very different ranking.
>
> Berend
>
> ______________________________________________
> 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