上对角计算并联中的R

问题描述:

我使用以下代码:上对角计算并联中的R

library(foreach) 
    library(doParallel) 
    N<-5 
    cl<-makeCluster(8) 
    registerDoParallel(cl) 

    #loop 
    s8 <- foreach(i=1:N, .combine='rbind') %:% 
    foreach(j=1:N, .combine='c') %dopar% { 

     dis <-as.numeric (i+j) } ## In reality there something more complicated 

    stopCluster(cl) 

我得到以下结果:

> s8 
     [,1] [,2] [,3] [,4] [,5] 
result.1 2 3 4 5 6 
result.2 3 4 5 6 7 
result.3 4 5 6 7 8 
result.4 5 6 7 8 9 
result.5 6 7 8 9 10 

我想获得上对角矩阵如下:

> s8 
     [,1] [,2] [,3] [,4] [,5] 
result.1 2 3 4 5 6 
result.2 0 4 5 6 7 
result.3 0 0 6 7 8 
result.4 0 0 0 8 9 
result.5 0 0 0 0 10 

如果我将内循环的迭代器更改为

foreach(j=i:N, .combine='c') %dopar% { 

我没有得到所需的结果。

也许这(虽然我可能会只并行外环):

library(foreach) 
library(doParallel) 
N<-5 
cl<-makeCluster(4) 
registerDoParallel(cl) 

#loop 
#result is a list of vectors 
s8 <- foreach(i=1:N) %:% 
    foreach(j=i:N, .combine='c') %dopar% { 

    as.numeric (i+j) } ## In reality there something more complicated 

stopCluster(cl) 

后处理,以获得相同的长度:

s8 <- t(vapply(s8, function(x) { 
    x <- rev(x) 
    length(x) <- N 
    rev(x) 
}, FUN.VALUE = numeric(N))) 

s8[lower.tri(s8)] <- 0 

#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 2 3 4 5 6 
#[2,] 0 4 5 6 7 
#[3,] 0 0 6 7 8 
#[4,] 0 0 0 8 9 
#[5,] 0 0 0 0 10 
+0

不会从运行时间上来看所提供的解决方案比快原始代码?因为实际上N(数据帧大小)很高。 – Avi

+0

它避免了不必要的迭代,因此应该更快。基准。当然,真正的速度改进必须考虑到你的“复杂”代码。 – Roland