2015-12-07 3 views
0

Я столкнулся с странной проблемой, когда использовал структурные массивы внутри цикла 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

+0

Вы не можете параллелизировать этот цикл, потому что 'b' изменяется на каждой итерации, а затем повторно используется, но в параллельном цикле итерации являются независимыми. Циклы 'parfor' не любят результаты одной итерации, влияющие на другую итерацию, потому что порядок выполнения итераций не является последовательным. – David

+0

Большое спасибо за ваш комментарий, Дэвид, но я не думаю, что 'b' изменяется каждая итерация - проблема, потому что здесь' b' является переменной сокращения. Если 'b' - массив, код работает без каких-либо проблем, и я получаю ожидаемые результаты. Вот почему я подозревал, что это имеет какое-то отношение к тому, как Matlab обрабатывает массив структуры. –

ответ

0

Функция накопления используется не допускается (reference)

Если только е известный некоммутативны встроенный, предполагается коммутативной. В настоящее время нет способа указать пользовательскую, некоммутативную функцию в parfor.

Из моего понимания вашего кода я рекомендую использовать ; (concatenate), чтобы накапливать и сортировать вне петли parfor. Другой альтернативой может быть нарезанная матрица, где каждой итерации разрешается заполнять один столбец из 10 элементов, окончательно сортируя и перестраивая его на вектор вне цикла.

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

  • Нет связанных вопросов^_^