如何快速地将大矩阵与向量的元素相乘?

时间:2015-09-21 08:45:00

标签: r

我想对一个非常大的二进制矩阵的每一行进行向量的元素乘法。我的向量的长度等于我的矩阵的列数。我已经实现了使用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
}

3 个答案:

答案 0 :(得分:1)

使用矢量回收,由于矩阵由列填充,因此需要转置:

t(t(M) * v)

答案 1 :(得分:1)

公认的答案当然不是在R上执行此操作的最快方法。这明显更快,我不知道这是否是最快的方法:

char

请注意,M * outer(rep.int(1L, nrow(M)), v) 提供了针对矩阵和数据帧的针对此问题的基于C / C ++的解决方案(它还支持分组扫描操作)。 Benckmark:

collapse::TRA

(注意:M是4915 x 4915的Eora 26 ICIO Matrix 2015,v为1 /输出)

答案 2 :(得分:1)

您可以使用非常快的 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