Используйте объекты и указатели в parfor- Циклы

Объекты

Когда вы запускаете parfor- цикл, можно отправить широковещательные переменные или нарезанные входные переменные от клиента рабочим, или отправить нарезанные выходные переменные от рабочих назад клиенту. save и load функции должны поддерживаться для каждого объекта, который вы отправляете в или от рабочих. Для получения дополнительной информации смотрите, Сохраняют и Процесс Загрузки для Объектов.

Присвоение значения к нарезанному свойству объекта или нарезанному полю структуры не поддерживается в parfor- цикл.

НедопустимыйДопустимый
s = struct;
parfor i = 1:4
    s.SomeField(i) = i;
end
parfor i = 1:4
    x(i) = i;
end
s = struct('SomeField',x);

Для получения дополнительной информации об ограничениях индексации первого уровня, смотрите Нарезанные Переменные.

Классы Handle

Можно отправить объекты указателя как входные параметры к телу parfor- цикл. Однако любые изменения, которые вы вносите, чтобы обработать объекты на рабочих во время итераций цикла, автоматически не распространены назад клиенту. Таким образом, изменения, внесенные в цикле, автоматически не отражаются после цикла.

Чтобы заставить клиент отразить изменения после цикла, явным образом присвойте модифицированные объекты указателя выходным переменным parfor- цикл. В следующем примере, maps нарезанная переменная ввода/вывода.

maps = {containers.Map(),containers.Map(),containers.Map()}; 
parfor ii = 1:numel(maps)
    mymap = maps{ii};   % input slice assigned to local copy
    for jj = 1:1000
        mymap(num2str(jj)) = rand;
    end
    maps{ii} = mymap;   % modified local copy assigned to output slice
end

Нарезанные переменные, ссылающиеся на Указатели на функции

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

Следующий пример использует указатель на функцию и for- цикл.

B = @sin;
for ii = 1:100
    A(ii) = B(ii);
end

Соответствующий parfor- цикл не позволяет B сослаться на указатель на функцию. Как обходное решение, используйте feval.

B = @sin;
parfor ii = 1:100
    A(ii) = feval(B,ii);
end

Похожие темы