Использование объектов и указателей в 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

Похожие темы