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-цикл не позволяет B для ссылки на указатель на функцию. Можно обойти задачу, используя feval.
B = @sin; parfor ii = 1:100 A(ii) = feval(B,ii); end