如果你有一個更大的列數你的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.int和rep之間的區別似乎是可以忽略的,兩個實現在重複運行microbenchmark()時交換位置。請記住,ncol(m)==長度(v)。
相關:http://stackoverflow.com/q/3643555/946850 – krlmlr