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