2016-01-24 57 views
0

我想用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

您不能修改定义在foreach循环之外的变量,并期望将数据发送回主进程。 for循环允许这种副作用,但它不能用于并行计算,除非工作人员在同一进程内是线程,并且R并行处理包不支持,因为R是单线程的。

相反,您需要从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]] 
+0

非常感谢你,这正是我想要的。 –

相关问题