如何使用foreach计算上三角矩阵中的每个元素?

时间:2016-01-24 09:39:13

标签: r foreach parallel-processing

我想使用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 个答案:

答案 0 :(得分: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]]