parfor- ПетлиПри передаче объектов в или из parfor-контур, объекты должны надлежащим образом облегчать сохранение и загрузку. Дополнительные сведения см. в разделе Сохранение и загрузка процесса для объектов.
Нельзя разделять поля объектов из-за ограничений индексирования первого уровня. Дополнительные сведения см. в разделе Разрезанные переменные.
Например, в коде слева обе строки цикла генерируют ошибку классификации из-за индексирования. В коде справа в качестве обходного решения для разделенных выходных данных используются отдельные разделенные массивы в цикле. Затем присваиваются поля структуры после завершения цикла.
| Инвалид | Действительный |
|---|---|
parfor i = 1:4 outputData.outArray1(i) = 1/i; outputData.outArray2(i) = i^2; end |
parfor i = 1:4 outArray1(i) = 1/i; outArray2(i) = i^2; end outputData = struct('outArray1',outArray1,'outArray2',outArray2); |
Можно отправлять объекты-дескрипторы в качестве входных данных в тело 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-loop не позволяет B для ссылки на дескриптор функции. Обойти проблему можно с помощью feval.
B = @sin; parfor ii = 1:100 A(ii) = feval(B,ii); end