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); |
Для получения дополнительной информации об ограничениях индексации первого уровня, смотрите Нарезанные Переменные.
Можно отправить объекты указателя как входные параметры к телу 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