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