2016-04-25 36 views
1

我使用以下代碼:上對角計算並聯中的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% { 

我沒有得到所需的結果。

回答

1

也許這(雖然我可能會只並行外環):

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