Я столкнулся с странной проблемой, когда использовал структурные массивы внутри цикла parfor
. Ниже моя главная функция:Массив структуры меняет размер при передаче функции сокращения в парформе Matlab?
comm_struct=struct('field1',0,'field2',zeros(10,1),'field3',sparse(zeros(10,10)));
a(1:100,1)=comm_struct;
b(1:10,1)=comm_struct;
disp(size(b))
parfor ct=1:12
b=max_select_2(b,a);
end
где max_select_2
является
function y=max_select_2(b,a)
if size(b,1)~=10
error('size of b is not 10 but %d',size(b,1)),
end
d(1:110,1)=struct('field1',0,'field2',zeros(10,1),'field3',sparse(zeros(10,10)));
d(1:10,1)=b;
d(11:110,1)=a;
[~,sort_idx]=sort([d.field1],'descend');
y=d(sort_idx(1:10));
Если я заменю parfor
с | для | и побежал на моем локальном MATLAB, не проблема, но если я использую parfor
и запустить это на кластере выход , который, как ожидается, но я также получил сообщение об ошибке "size of b is not 10 but 100"
, что означает, по какой-то причине, когда b
передается к функции max_select_2
, ее размер изменился с 10 до 100? Я сомневаюсь, что это имеет какое-то отношение к тому, как Matlab обрабатывает структурный массив, но я действительно не знаю, что происходит и как его исправить ...
Любая помощь приветствуется! Благодаря!
Li
Вы не можете параллелизировать этот цикл, потому что 'b' изменяется на каждой итерации, а затем повторно используется, но в параллельном цикле итерации являются независимыми. Циклы 'parfor' не любят результаты одной итерации, влияющие на другую итерацию, потому что порядок выполнения итераций не является последовательным. – David
Большое спасибо за ваш комментарий, Дэвид, но я не думаю, что 'b' изменяется каждая итерация - проблема, потому что здесь' b' является переменной сокращения. Если 'b' - массив, код работает без каких-либо проблем, и я получаю ожидаемые результаты. Вот почему я подозревал, что это имеет какое-то отношение к тому, как Matlab обрабатывает массив структуры. –