Parfor с вложенным для: переменная классификация зависит от цикла endVal - PullRequest
0 голосов
/ 25 октября 2018

Я хочу вычислить фрактальное изображение в двух вложенных циклах по индексам пикселей (ix, iy).Пример кода просто назначает случайные числа значениям RGB вместо реальных вычислений.

x = 0:.2:4;
y = 0:.2:3;
nX = length(x);
nY = length(y);
RenderRed = zeros(nX,nY); RenderGreen = zeros(nX,nY); RenderBlue = zeros(nX,nY);

parfor ix = 1:nX
    % for iy = 1:length(y)  % error
    for iy = 1:nY
        % "compute" pixel (ix,iy)
        RenderRed(ix, iy) = rand; RenderGreen(ix, iy) = rand; RenderBlue(ix, iy) = rand;
    end
end

Pctr = [];
Pctr(:,:,1)=RenderRed; Pctr(:,:,2)=RenderGreen; Pctr(:,:,3)=RenderBlue;
handle = image(Pctr);
shg

Код работает, как показано, но если конечное значение цикла iy изменяется с nY на длину (y) -см. закомментированную строку - выдается ошибка:

Error: The variable RenderRed in a parfor cannot be classified.
See Parallel for Loops in MATLAB, "Overview".

Почему?В моем понимании секционированных переменных ни одна версия не должна работать: нужно использовать вспомогательную переменную, собирающую результаты внутреннего цикла, и назначить ее фрагменту матрицы.Но длина (y) вместо nY никак не должна влиять на классификацию переменных, поскольку y никогда не присваивается в циклах.

mlint не находит ошибок, ни в одной из версий.То же самое с версиями MATLAB 2016b, 2017b.

1 Ответ

0 голосов
/ 25 октября 2018

Согласно документации Matlab , это действительно может работать!Если вы хотите использовать вложенные циклы for внутри циклов parfor:

Для правильной классификации переменных, вы должны определить диапазон цикла for, вложенного в цикл parfor:постоянные числа или переменные .

enter image description here

...