Используйте объекты и указатели в parfor- Циклы

Используя Объекты в циклах 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);

Классы Handle

Можно отправить объекты указателя как входные параметры к телу 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

Похожие темы