Проблема в том, что вы передаете всю переменную Tree{i-1}
в каждую (параллельную) итерацию parfor
l oop. Это связано с тем, что интерпретатор MATLAB недостаточно «умен», чтобы определить, какие части Tree{i-1}
вам понадобятся, потому что вы динамически индексируете его с помощью вычислений, основанных на j
.
. Переменная temp во внешнем l oop, которая может быть напрямую проиндексирована с помощью j
во внутреннем l oop, должна разрешать это:
initialBranch = initialize();
Tree{1} = initialBranch;
for i = 2 : Nbranches
N = elmsInBranch(i);
branch = cell(1, N);
% Pre-partition the data to send individual packets to each node
iTrees = arrayfun( @(j) Tree{i-1}([2*j-1,2*j]), 1:N, 'uni', 0 );
% Parallel loop...
parfor j = 1 : N
jTrees = iTrees{j}; % direct indexing using 'j', no calculation
branch{j} = assembleBlocks(jTrees{1}, jTrees{2});
end
Tree{i} = branch;
end
Обратите внимание, что cellfun
, который я добавил разделяет ваши данные так, чтобы каждый параллельный узел мог напрямую индексировать по одному элементу за раз, который содержит оба элемента Tree
, требуемые в l oop. Это может вызвать дублирование в памяти, но меньшее дублирование, чем передача всего массива каждому узлу!