Как векторизовать цикл двойной зависимости в Matlab?

У меня есть функция цикла, внутренний цикл которой зависит от значения вашего внешнего цикла.

for jj = 1:500
     for ii = jj:500
         Gamma(ii,jj) =mod( ii-jj, 255);
     end
end

Я ищу способ сделать код максимально быстрым: векторизованным или bsxfun. Сейчас я использую векторизованный способ, но он не может быть оптимальным. Я задаю вопрос, чтобы найти лучшее решение или, по крайней мере, лучше, чем я.

[iiValues, jjValues] = meshgrid(1:500, 1:500); 
mask = iiValues >= jjValues;  % ii >= jj
ii= iiValues(mask);    
jj= jjValues(mask);
Gamma(ii,jj)=mod(ii-jj,255) % I am not sure about the line

Спасибо

1 ответ

Решение

С помощью bsxfun а также tril:

Gamma = mod(tril(bsxfun(@minus, (1:500).', 1:500)), 255);
%this 1:500 is for the inner loop---^        ^---This 1:500 is for the outer loop

или используя тот же подход с неявным расширением (для MATLAB R2016b и выше):

Gamma = mod(tril((1:500).'-(1:500)), 255);
Другие вопросы по тегам