Я хочу вычислить фрактальное изображение в двух вложенных циклах по индексам пикселей (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 на length (y) - см. Прокомментированную строку - выдается ошибка:
Error: The variable RenderRed in a parfor cannot be classified.
See Parallel for Loops in MATLAB, "Overview".
Почему? В моем понимании нарезанных переменных никакая версия не должна работать: нужно использовать вспомогательную переменную, собирающую результаты внутреннего цикла, и назначать ее части матрицы. Но length (y) вместо nY не должен вообще влиять на классификацию переменных, потому что y никогда не назначается в циклах.
mlint не находит ошибок ни в одной из версий. Такое же поведение с версиями MATLAB 2016b, 2017b.
Согласно Документация Matlab, это действительно может работать! Если вы хотите использовать вложенные циклы for
внутри циклов parfor
:
For proper variable classification, you must define the range of a for-loop nested in a parfor-loop by constant numbers or variables.
Я предполагаю, что Matlab не знает, изменена ли переменная
nY
или нет в цикле parfoor, поэтому, чтобы избежать изменения этой переменной одним пулом, matlab просто не дает вам права устанавливать предел цикла for с помощью вызова функции. Я полагаю, что если бы этот код был скомпилирован, а не интерпретирован, оба решения могли бы работать.