4

以下に、複数の CPU を使用して並列プロセスとして実行するように変換したい R のコードを示します。パッケージを使用してみforeachましたが、うまくいきませんでした.3レベルのネストされたループがあるという事実を考慮して、それを機能させる方法の良い例を見つけることができませんでした。助けていただければ幸いです。以下のコードの例 - 例として役立つように単純な関数を作成しました。

celnum <- c(10,20,30)
t2 <- c(1,2,3)
allrepeat <- 10

samplefunction <- function(celnum,t2){

        x <- rnorm(100,celnum,t2)
        y = sample(x, 1)
        z = sample(x,1)

        result = y+z


        result 
}

従来の方法で結果を取得する:

z_grid <- matrix(, nrow = length(celnum), ncol = length(t2))

repetitions <- matrix(, nrow = allrepeat, ncol = 1)



set.seed=20
for(i in 1:length(celnum)){
        for (j in 1:length(t2)){
                for (k in 1:allrepeat) {
                        results <- samplefunction(celnum[i],t2[j]) 
                                repetitions[k] <- results
                                z_grid[i,j] <- mean(repetitions,na.rm=TRUE) 
                }  
        }
}

z_grid

foreachを使用して同じことをしようとしています:

set.seed=20

library(foreach)
library(doSNOW)

cl <- makeCluster(3, type = "SOCK")
registerDoSNOW(cl)

set.seed=20
output <- foreach(i=1:length(celnum),.combine='cbind' ) %:% 
        foreach (j=1:length(t2), .combine='c') %:%   
                foreach (k = 1:allrepeat) %do% {
                        mean(samplefunction(celnum[i],t2[j]) )
}  
output

これは、3x3 ではなく 30x2 次元の行列を返すため、私が望むようには機能しません。私の意図は、i と j の組み合わせのシナリオを k 回シミュレートすることであり、i と j の組み合わせごとにこれらの k シミュレーションの平均を取得したいと考えています。

4

1 に答える 1