如果你有一个更大的列数你的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