如何使apply()函数更快?

3
我有两个矩阵。我想使用第一个矩阵的列来过滤第二个矩阵,然后找到过滤后集合的总和。我使用了以下代码,它完全正常运行。
apply(firstMat,2,function(x) sum(secondMat[x,x]))

然而,数据集很大,我想找到一种替代方法来加快处理过程。
这是一个在小范围内可复现的示例:
firstMat<-matrix(c(T,F,T,F,F,T,T,F,F,F),nrow=5,ncol=2)
secondMat<-matrix(c(1,0,0,0,1,0,0,0,1,1,1,0,1,0,1,1,1,0,0,0,1,1,1,0,1),nrow=5,ncol=5)

我会非常感激如果你能帮助我。

1
请提供一个可重现的示例和期望的输出。 - David Arenburg
我已将其添加到问题中。谢谢您的时间。 - user2079550
2个回答

1
也许您的BLAS比显式循环更快:
diag( t(firstMat) %*% secondMat %*% firstMat )

你是对的。甚至这个更好用:rowSums(t(firstMat)%% secondMatt(firstMat)) - user2079550

1
你可以在多个集群上并行运行apply函数。
firstMat<-matrix(c(T,F,T,F,F,T,T,F,F,F),nrow=5,ncol=2)
secondMat<-matrix(c(1,0,0,0,1,0,0,0,1,1,1,0,1,0,1,1,1,0,0,0,1,1,1,0,1),nrow=5,ncol=5)

# create custers
library(doSNOW)
cl <- makeCluster(2, type = "SOCK") # creates 2 clusters 
# can use detectCores() from package parallel to check number of cores in your machine
registerDoSNOW(cl)
clusterExport(cl,list("secondMat")) # need to export secndMAT to each cluster since will be used in cluster

# Option 1: Using parApply from package `parallel`
library(parallel)
parApply(cl,firstMat,2,function(x) sum(secondMat[x,x]))

# Option 2: Using aaply from package `plyr`
library(plyr)    
aaply(firstMat,2,function(x) sum(secondMat[x,x]),.parallel=T)

stopCluster(cl)

通过这个简单易懂的例子,它并没有展示出任何速度提升,但我期望对于大矩阵来说,这两个选项都比 apply 更快。


感谢您的完整回答。我也期望使用并行分析能够获得更好的性能。但结果变得更糟了。 - user2079550

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接