/ / как да се използва foreach изчисляване на всеки елемент в горната триъгълна матрица? - r, foreach, паралелна обработка

как да използвате foreach изчисли всеки елемент в горната триъгълна матрица? - r, foreach, паралелна обработка

Искам да изчислим всеки елемент в горната триъгълна матрица като използваме foreach функция

library(foreach)
library(doParallel)

cl <- makeCluster(2)
registerDoParallel(cl)

tempdata <- matrix(0, nrow = 10, ncol = 10)
tempdata2 <- matrix(0, nrow = 10, ncol = 10)

foreach (i = 1:9, .combine="rbind") %do% {
for (j in (i+1):10) {
tempdata[i, j] <- i+j;
tempdata2[i, j] <- i*j

}
}

работи, когато използвам %do%, но когато използвам% dopar% получавам нищо. Какво правя погрешно? Благодаря ви момчета. Всяко предложение ще бъде оценено.

Отговори:

1 за отговор № 1

Не можете да променяте променливите, дефинирани извън foreach и очакваме данните да бъдат изпратени обратно към главния процес. for примки позволяват този вид страничен ефект, но тойне работи в паралелни изчисления, освен ако работниците не са нишки в рамките на един и същ процес, и това не се поддържа от никой от пакетите за R паралелна обработка, защото R е с една нишка.

Вместо това трябва да върнете стойност от тялото на foreach и комбинирайте тези стойности, за да получите желания резултат. Във вашия случай ще изчислите две стойности за една итерация на foreach цикъл, така че трябва да ги включите в списък, което означава, че се нуждаете от по-сложна функция за комбиниране. Ето един начин да го направите:

library(doParallel)
cl <- makeCluster(2)
registerDoParallel(cl)

comb <- function(...) {
mapply(rbind, ..., SIMPLIFY=FALSE)
}

r <- foreach(i=1:9, .combine="comb", .multicombine=TRUE) %dopar% {
tmp <- double(10)
tmp2 <- double(10)
for(j in (i+1):10) {
tmp[j] <- i+j
tmp2[j] <- i*j
}
list(tmp, tmp2)
}

tempdata <- r[[1]]
tempdata2 <- r[[2]]