2016-04-25 3 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

Смежные вопросы