Доступ к глобальной переменной при вызове функции в parfor в Matlab

Мне интересно, как я могу легко получить доступ к глобальной переменной при вызове функции в цикле parfor? Например, пример кода выглядит следующим образом:

global a
a = 132.1;

A = [0, 0, 0];

for i=1:3
    A(i) = test(i);
end

И тестовая функция

function f = test(v)
global a
f = a+v;

Код должен быть правильным в этом формате, однако, если я поменяю на parfor, возникнет проблема. Я думаю, что основная проблема заключается в глобальной переменной a. Итак, как я могу изменить код? Хотя в этом примере модификация простая и парфор не нужен, но мой реальный код действительно сложен, проблема сводится к тому же.


person Terry    schedule 05.08.2016    source источник
comment
Почему бы не передать a вашей функции? В частности, если a не меняется, это действительно лучший выбор. Если он изменяется, вам следует вообще пересмотреть использование parfor.   -  person Suever    schedule 05.08.2016


Ответы (1)


Проблема заключается в parfor и global переменные:

Есть два ограничения.

You cannot place a GLOBAL declaration directly inside a PARFOR loop
The MATLAB workers executing the body of your PARFOR loop are separate MATLAB processes, and the values of global variables are not synchronised

Таким образом, хотя вы можете использовать глобальные переменные в функциях, вызываемых из тела вашего цикла PARFOR, они, вероятно, ведут себя не так, как вам хотелось бы.

Поэтому, на мой взгляд, вы можете передать в цикл переменную a и избегать глобальных переменных, что является хорошим правилом для функционального программирования и для программирования в целом. Также есть другие решения, подобные этому:

http://www.mathworks.com/matlabcentral/fileexchange/31972-worker-object-wrapper

person anquegi    schedule 06.08.2016
comment
не совсем удобное решение, особенно если вы имеете дело с задачами физики... рассмотрим функцию внутри parforloop, которая вызывает несколько других функций, где всем им нужна куча физических констант... должен ли я привыкнуть к прохождению 60+ константы для каждой функции? Должен быть способ транслировать глобальные переменные перед parfor, как это делается в C/C++/Fortran и MPI. - person OD IUM; 28.02.2020