2016-04-25 13 views
1

I mit dem folgenden Code:Ober diagonal Berechnung parallel in 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) 

I das folgende Ergebnis erhalten:

> 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 

Ich möchte die obere Diagonalmatrix erhalten, wie folgt:

> 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 

Wenn ich den Iterator der inneren Schleife zu

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

Ich bekomme nicht die erforderlichen Ergebnisse.

Antwort

1

Vielleicht (obwohl ich würde wahrscheinlich parallelisieren nur die äußere Schleife):

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) 

Nachverarbeitung gleichen Längen zu erhalten:

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

hat die angebotene Lösung aus Laufzeitperspektive ist schneller als der ursprüngliche Code? da in Wirklichkeit die N (Datenrahmengröße) hoch ist. – Avi

+0

Es vermeidet unnötige Iterationen und sollte daher schneller sein. Benchmark es. Natürlich müssten echte Geschwindigkeitsverbesserungen Ihren "komplizierten" Code berücksichtigen. – Roland