Я пытаюсь распараллелить вложенный цикл for с помощью пакета foreach.Однако, хотя скорость намного выше, она не дает правильного ответа.Идея этого вложенного цикла for довольно проста.Результат (число) самого внутреннего вложенного цикла добавляется ко второму уровню цикла, который добавляется к третьему уровню цикла.Ниже приведены воспроизводимые данные:
input <- data.frame(matrix(rnorm(100*100, 1, .5), ncol=100))
input[input <0] =0
input2 <- split(input, f=input$X201)
d= 0
n= 0
j = 1
k = 1
f = 0
s= 0
cl <- parallel::makeCluster(20)
doParallel::registerDoParallel(cl)
tm1 <- system.time(
results2 <- foreach(h = (1:length(input2)),.combine = 'c')%dopar%{
return ( for (j in (1:nrow(input2[[h]]))){
for (k in (1:nrow(input2[[h]]))){
if (k != j) {
for (i in (2:ncol(input2[[h]]))){
if (input2[[h]][j,i] !=0){
n= n+ (input2[[h]][j,i] * input2[[h]][k, i])
d= d+ input2[[h]][j, i] * input2[[h]][j, i]
}else {
n= n
}
}
f= f+ n/d* input2[[h]][k, 1]
}
n= 0
d= 0
}
s= s+ f* input2[[h]][j,1]
k = 1
f = 0
}
)
}
)
parallel::stopCluster(cl)
registerDoSEQ()
print("Cluster stopped.")
results2
Конечный результат results2
равен нулю.Кроме того, после запуска цикла foreach я обнаружил, что только i равно 8, h равно 6, а k и j равны только 1, что кажется неправильным, поскольку я хочу, чтобы k в любое время было неравным j (как указано в коде), иЯ ожидаю, что h будет 10 (потому что в списке 10 элементов).Я также ожидаю, что мне будет 20, потому что в каждом элементе есть 20 строк данных.Интересно, почему я не прав в коде.