R - 将 df 或矩阵的每一行与一个向量相乘

标签 r data.table matrix-multiplication

虽然看起来很简单,但我做不到。 我想将矩阵(或数据帧或数据表)b 中的每一行与向量 a 相乘。

a <- data.table(t(1:4))
b <- matrix(data=2, nrow=3, ncol=4)

期望的输出(矩阵、数据框或数据表形式):

     [,1] [,2] [,3] [,4]
[1,]    2    4    6    8  
[2,]    2    4    6    8
[3,]    2    4    6    8

谁能帮助我如何(有效地)做到这一点?

最佳答案

b*rep(unlist(a),each=nrow(b))
#      [,1] [,2] [,3] [,4]
# [1,]    2    4    6    8
# [2,]    2    4    6    8
# [3,]    2    4    6    8

或者只是b*rep(a,each=nrow(b))如果你定义 a <- 1:4

它只是一个向量化的元素明智的乘法,没有来自 rep 的转换.

编辑:

似乎是 rep 拖慢了我的解决方案。这是一个基准测试,其中我包含一个带有预计算代表的选项,以及对扫描选项的一些改进(仅从源代码中获取相关部分)。

a <- data.table(t(1:200))
b <- matrix(data=2, nrow=100000, ncol=200)

a_vec <- unlist(a)
rep_a <- rep(a_vec,each=nrow(b))
microbenchmark::microbenchmark(
  mkr1 = a[,lapply(.SD,function(x)(x*b[,x]))],
  mkr2 = t(t(b) * (as.matrix(a)[1,])),
  mkr_update = a[,lapply(V1:V4,function(i)(a[[i]]*b[,i]))],
  mm = b*rep(unlist(a),each=nrow(b)),
  mm_cheat = b*rep_a,
  regular_sweep = sweep(b,2,unlist(a),`*`),
  regular_sweep2 = sweep(b,2,a_vec,`*`),
  improved_sweepA1 = b*aperm(array(unlist(a),rev(dim(b)))),
  improved_sweepA2 = b*aperm(array(a_vec,rev(dim(b)))),
  improved_sweepB1 = b*a[rep_len(1,nrow(b)),],
  improved_sweepB2 = b*t(a_vec)[rep_len(1,nrow(b)),],
  unit = "relative",
  times=50)


Unit: relative
             expr       min        lq      mean    median        uq       max neval
             mkr1  42.12228  44.15266  50.23959  46.35240  57.20280  65.07289    50
             mkr2 114.58427 124.19653 125.25660 131.08677 124.17058 114.91137    50
       mkr_update   1.00000   1.00000   1.00000   1.00000   1.00000   1.00000    50
               mm 231.34331 223.74365 217.50145 225.91117 215.90765 165.64814    50
         mm_cheat  13.38838  13.22556  14.94682  13.36649  12.95260  25.15564    50
    regular_sweep  96.15758 124.26746 121.04428 128.67282 129.19407 119.20210    50
   regular_sweep2  97.79001 124.69191 124.74650 134.64249 134.97407 107.47152    50
 improved_sweepA1  96.57837 124.86189 116.93736 127.08909 124.92805 105.83318    50
 improved_sweepA2  96.27737 122.49773 118.45262 128.13369 126.15029 106.58669    50
 improved_sweepB1 214.95773 227.39523 226.04339 248.38553 232.50401 161.45341    50
 improved_sweepB2  31.20967  32.61873  37.74552  33.70969  41.52149  55.93362    50

关于R - 将 df 或矩阵的每一行与一个向量相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49462591/

相关文章:

python - 有没有一种简单的方法可以从 mpg 文件中打印出 1's and 0' s?

r - fread - 跳过以特定字符开头的行 - "#"

r - data.table 不能很好地与 checkUsage 配合使用

返回分组数据子组的最小值

c - k x k bool 矩阵的快速乘法,其中 8 <= k <= 16

python - 如何将此Python逗号分隔的字符串列表分成多个键值对?

r - 从文本中提取模式

r - ggplot2:不同列上的堆叠条形图

r - 排列数据框以实现两两相关

c - 通过线程和 SIMD 并行化矩阵乘法