列の数が多い場合、 t(t(m) * v) ソリューションは行列乗算ソリューションよりも大幅に優れています。ただし、より高速なソリューションがありますが、メモリ使用量が高くなります。rep() を使用して m の大きさの行列を作成し、要素ごとに乗算します。mnelの例を変更した比較は次のとおりです。
m = matrix(rnorm(1200000), ncol=600)
v = rep(c(1.5, 3.5, 4.5, 5.5, 6.5, 7.5), length = ncol(m))
library(microbenchmark)
microbenchmark(t(t(m) * v),
m %*% diag(v),
m * rep(v, rep.int(nrow(m),length(v))),
m * rep(v, rep(nrow(m),length(v))),
m * rep(v, each = nrow(m)))
# Unit: milliseconds
# expr min lq mean median uq max neval
# t(t(m) * v) 17.682257 18.807218 20.574513 19.239350 19.818331 62.63947 100
# m %*% diag(v) 415.573110 417.835574 421.226179 419.061019 420.601778 465.43276 100
# m * rep(v, rep.int(nrow(m), ncol(m))) 2.597411 2.794915 5.947318 3.276216 3.873842 48.95579 100
# m * rep(v, rep(nrow(m), ncol(m))) 2.601701 2.785839 3.707153 2.918994 3.855361 47.48697 100
# m * rep(v, each = nrow(m)) 21.766636 21.901935 23.791504 22.351227 23.049006 66.68491 100
ご覧のとおり、rep() で「each」を使用すると、速度が犠牲になり、わかりやすくなります。rep.int と rep の違いはごくわずかのようです。どちらの実装も、microbenchmark() を繰り返し実行すると場所が入れ替わります。ncol(m) == length(v) であることに注意してください。
