裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

行列とベクトルの積

2015年01月13日 | ブログラミング

twitter はやらないのでこちらでコメント

R の行列は列優先なので,

x = matrix(1, 3, 3)
y = 1:3

のときに,x*y でよい場合と,t(t(x)*y) が欲しい場合がある。

> x*y
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    2    2
[3,]    3    3    3

> t(t(x)*y)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    2    3
[3,]    1    2    3


後者の場合に t(t(*)) がダサいと思うので,何かよい方法がないのか...ということだが。

x* matrix(rep(y, 3), 3, byrow=TRUE)

のようにするのも一法だ。

> x* matrix(rep(y, 3), 3, byrow=TRUE)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    2    3
[3,]    1    2    3

しかし,y を行方向に水増しした行列をつくって掛け算するということなので,無駄であることは明らか。x の行数が小さい場合にはやや有利なのかもしれない。

> x = matrix(1, 3, 3)
> y = 1:3
> system.time(replicate(1e4, t(t(x)*y)))
   ユーザ   システム       経過  
     0.215      0.008      0.242
> system.time(replicate(1e4, x* matrix(rep(y, 3), 3, byrow=TRUE)))
   ユーザ   システム       経過  
     0.050      0.000      0.049

> x = matrix(1, 300, 3)
> y = 1:3
> system.time(replicate(1e4, t(t(x)*y)))
   ユーザ   システム       経過  
     0.360      0.040      0.406
> system.time(replicate(1e4, x* matrix(rep(y, 300), 300, byrow=TRUE)))
   ユーザ   システム       経過  
     0.321      0.027      0.348

> x = matrix(1, 3000, 3)
> y = 1:3
> system.time(replicate(1e4, t(t(x)*y)))
   ユーザ   システム       経過  
     2.315      0.774      3.074
> system.time(replicate(1e4, x* matrix(rep(y, 3000), 3000, byrow=TRUE)))
   ユーザ   システム       経過  
     2.951      0.909      3.844

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村