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