如果您有更多的列,您的 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)。