使用sapply在R中有效地循环两个矩阵

时间:2017-06-01 22:46:15

标签: r loops sapply

我试图创建一个矩阵,从两个单独的矩阵中获取索引(200 x 1000,但也可能有不同的列大小)并根据函数ks.test计算一个值(Kologomorov-斯米尔诺夫试验)。目前我已经嵌套了创建KS.mat的sapply函数,但这只会使代码更清晰,而不是更快。有没有办法加快速度呢?

N1=100
N2=100
m=1000

set.seed(12345)
X1=matrix(rnorm(N1*m),nrow=N1)
X2=matrix(rnorm(N2*m),nrow=N2)

#Data matrix
dat = rbind(X1,X2)

#Create a matrix of permuted labels where X1 are labeled 1 and X2 are labeled 2
B=1000
label.mat=matrix(rep(rep(c(1,2),times=c(N1,N2)),B),ncol=B)
perm.mat=apply(label.mat,2,sample)

#Create matrix of KS statistics based on permuted labels and dat
KS.mat=sapply(seq(m),function(j) 
  sapply(seq(B),function(b) ks.test(dat[perm.mat[,b]==1,j],dat[perm.mat[,b]==2,j])$statistic))

1 个答案:

答案 0 :(得分:1)

我不知道是否有数学方法可以降低此任务的复杂性,但我有好消息!既然您已使用for重写了sapply循环,那么您距离parSapply并行一步即可。应该这么简单:

require('parallel')
cl = makeCluster(detectCores())
clusterExport(cl, c("perm.mat","B","dat"))
KS.mat=parSapply(cl, seq(m),function(j) 
  sapply(seq(B),function(b) ks.test(dat[perm.mat[,b]==1,j],dat[perm.mat[,b]==2,j])$statistic))

预计速度会随着机器上可用核心数量的增加而增加。