Вложенные циклы foreach с использованием doParallel в R - PullRequest
1 голос
/ 23 февраля 2020

У меня есть вложенное значение для l oop ниже (что мало что делает, но это более простая версия того, что я хотел бы сделать). Я хотел бы распараллелить это вычисление.

x=seq(-4,4,length.out=1000)
y1 = pnorm(x)
y2 = pnorm(x, mean = 2)
y3 = pnorm(x, mean = 2.1)
y4 = pnorm(x, mean = 2.2)
y5 = pnorm(x, mean = 2.3)
y6 = pnorm(x, mean = 2.4)
y7 = pnorm(x, mean = 2.5)
y8 = pnorm(x, mean = 2.6)

A = matrix(c(y1,y2),nrow = 2, byrow =TRUE)
B = array(c(y3,y4,y5,y6,y7,y8), dim = c(1000,3,2))

tt = 1:1000
BB = 3
set.seed(1)
BBB = runif(BB)

res=matrix(0,nrow=2,ncol=2)
width = double(2)

for(i in 1:2){
  Ai=A[i,]
  Bi=B[,,i]

  C = approx(Ai, tt, BBB)$y

  D=double(BB)

  for(j in 1:3){
    D[j]=approx(tt, Bi[,j], C[j])$y
  }

  alphastar=quantile(D,c(0.1/2,1-0.1/2))

  res[i,]=approx(Ai, tt, alphastar)$y
  width[i] = diff(res[i,])

}

Есть несколько похожих вопросов Q1 и Q2 , но они не отвечают на мой вопрос. Таким образом, мои вычисления имеют следующую форму:

for(i in 1:2){
code involving only i subscript

for(j in 1:3){
code which uses output from above
}

code involving output from j loop
}

Можно ли таким образом вкладывать циклы, используя foreach? Я хотел бы, чтобы этот код возвращал res (матрицу) и width (вектор).

Edit: Q1 содержит интересный пример:

x <- foreach(i=1:8, .combine='rbind') %:%
   foreach(j=1:2, .combine='c') %dopar% {
     l <- runif(1, i, 100)
     i + j + l  
   }

Но, Я не хочу запускать (в этом примере) l <- runif(1, i, 100) для каждого j. Это нужно запустить только один раз, для каждого я. Выполнение всего в обоих циклах будет тратить много времени (возможно, не в этом примере, но в других примерах). Можно ли получить что-то вида

x <- foreach(i=1:8, .combine='rbind') %:%
  l <- runif(1, i, 100)
  foreach(j=1:2, .combine='c') %dopar% {
    i + j + l  
  }

Приведенный выше код не работает. Есть ли способ изменить вышеприведенное, чтобы позволить коду, который не включает j, вычисляться в первом l oop и не тратить время на его выполнение для каждого j?

1 Ответ

0 голосов
/ 23 февраля 2020

Посмотрите на this . Аналогичный вопрос о Nested foreach () ответил на несколько примеров.

...