繁体   English   中英

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

[英]Efficiently loop over two matrices in R using sapply

我正在尝试创建一个矩阵,该矩阵接受来自两个单独矩阵的索引(均为200 x 1000,但也可以具有不同的列大小),并基于ks.test函数(Kologomorov-Smirnov测试)计算值。 当前,我嵌套了确实创建KS.mat sapply函数,但这只是使代码更KS.mat而不是更快。 有没有办法加快速度?

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))

我不知道是否有一种数学方法可以降低此任务的复杂性,但是对您来说我有个好消息! 现在,您已使用sapply重写了for循环,您距离使用parSapply并行化它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))

期望与计算机上可用内核数量相关的速度提高。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM