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

Используя Объекты в циклах parfor

Если вы передаете объекты в или из parfor - цикл, объекты должны правильно упростить быть сохраненным и загруженным. Для получения дополнительной информации смотрите, Сохраняют и Процесс Загрузки для Объектов (MATLAB).

Вы не можете нарезать поля объектов из-за ограничений индексации первого уровня. Для получения дополнительной информации смотрите Нарезанные Переменные.

Например, в коде слева, обе строки в цикле генерируют ошибку классификации из-за индексации. В коде справа, как обходное решение для нарезанного вывода, вы используете отдельные нарезанные массивы в цикле. Затем вы присваиваете поля структуры после того, как цикл будет завершен.

НедопустимыйДопустимый
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

Похожие темы