【问题标题】:How to do elementwise multiplication of big matrix with vector very fast?如何快速将大矩阵与向量进行元素乘法?
【发布时间】:2015-09-21 08:45:00
【问题描述】:

我想对一个向量与一个非常大的二进制矩阵的每一行进行元素乘法。我的向量的长度等于我的矩阵的列数。我已经实现了如下使用 for 循环,但它非常慢。 有谁知道加快速度的解决方案吗?

A <- c()
M # Binary matric
W <- matrix(0, nrow=nrow(M), ncol=ncol(M))
W <- data.frame(W)
for (i in 1:nrow(W)) {
    W[i,] <- M[i,] * A
}

【问题讨论】:

  • W 转换为 data.frame 是错误的。 AFAIK,矩阵子分配比 data.frame 子分配快。

标签: r


【解决方案1】:

接受的答案肯定不是在 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/输出)

【讨论】:

    【解决方案2】:

    使用向量循环,由于矩阵是按列填充的,所以需要转置:

    t(t(M) * v)
    

    【讨论】:

      【解决方案3】:

      您可以使用Rfast::eachrow,速度非常快。

      M<-Rfast::matrnorm(1000,1000)
      v=rnorm(1000)
      
      Rfast2::benchmark(Rfast::eachrow(M,v,"*"),M * outer(rep.int(1L, nrow(M)), v),M * Rfast::Outer(rep.int(1, nrow(M)), v),times = 100)
         milliseconds 
                                                  min      mean      max
      Rfast::eachrow(M, v, "*")                2.4790  4.440305  12.3601
      M * outer(rep.int(1L, nrow(M)), v)       5.7612 25.952871 807.1748
      M * Rfast::Outer(rep.int(1, nrow(M)), v) 3.4185  7.525743 204.3348
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多