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