接受的答案肯定不是在 R 上执行此操作的最快方法。这明显更快,我不知道它是否是最快的方法:
M * outer(rep.int(1L, nrow(M)), v)
请注意,collapse::TRA 还为矩阵和数据帧提供了基于 C/C++ 的解决方案(它还支持分组扫描操作)。基准测试:
library(microbenchmark)
library(collapse)
all_obj_equal(t(t(M) * v), M * outer(rep.int(1L, nrow(M)), v), TRA(M, v, "*"))
[1] TRUE
microbenchmark(t(t(M) * v), M * outer(rep.int(1L, nrow(M)), v), TRA(M, v, "*"), times = 100, unit = "relative")
Unit: relative
expr min lq mean median uq max neval cld
t(t(M) * v) 16.256563 12.703469 10.771698 12.113859 10.148008 8.365288 100 c
M * outer(rep.int(1L, nrow(M)), v) 1.097177 1.449713 1.375522 1.426085 1.273911 1.785404 100 b
TRA(M, v, "*") 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 100 a
(注意:这里的M是维度4915 x 4915的Eora 26 ICIO Matrix 2015,v是1/输出)