问题描述
我具有以下功能:
l2norm_squared = function(X) Re(sum(Conj(t(X)) %*% X))
fast_mmd = function(X,Y,nBasis = 2^6,seed = NULL) {
if (!is.null(seed)) set.seed(seed)
d = ncol(X)
if (ncol(Y) != d) stop('# of columns of X and Y should match.')
n = nrow(X)
m = nrow(Y)
N = nBasis
Z = matrix(rnorm(N*d),nrow=N)
ZXt = Z %*% t(as.matrix(X))
ZYt = Z %*% t(as.matrix(Y))
phi = function(sigma) rowMeans( exp(1i*ZXt/sigma) / sqrt(N))
psi = function(sigma) rowMeans( exp(1i*ZYt/sigma) / sqrt(N))
l2norm_squared( phi(1) - psi(1) )
}
我正在尝试并行运行它。例如,我这样设置数据:
d = 42
X = matrix(rnorm(100*d),nrow=100)
Y = X[50:60,]
ncores = 4
nBasis = 2^6
然后运行以下命令:
seed = 1
all_indices = 1:ncol(X)
system.time( out <- parallel::mclapply(combn(all_indices,2,simplify = F),function(ind) {
ind = setdiff(all_indices,ind)
fast_mmd(X[,ind],Y[,nBasis,seed)
},mc.cores = ncores) )["elapsed"]
或以下内容:
doParallel::registerDoParallel(ncores)
p = ncol(X)
C = combn(1:p,simplify = F)
nC = length(C)
library(foreach)
foreach(i=1:nC,.combine = "c") %dopar% {
ind = setdiff(1:p,C[[i]])
fast_mmd(X[,seed)
}
在这种情况下,mclapply
和foreach
都运行良好,并且都在不到一秒钟的时间内返回。但是,当我将d = 42
更改为d = 43
时,两个循环都无限期挂起,因此我必须终止该过程。对于其他输入,或者在您的情况下,它可能是不同的阈值,但是d
上似乎存在阈值(在这种情况下,从42变为43)会导致此行为。知道是什么原因造成的,以及如何解决?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)