exponenta event banner

Использовать объекты и маркеры перемещения в 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

Связанные темы