How to vectorize this code to eliminate nested For loops?

1 vue (au cours des 30 derniers jours)
Jae Min Lee
Jae Min Lee le 6 Sep 2018
Commenté : Greg le 6 Sep 2018
Would like to know how this code is vectorized:
for r=1:rows
for c=1:cols
if ((Lin <= Limg(r,c)) && (Limg(r,c) <= Hin))
enhanceImg(r,c) = Lout + (Hout - Lout) * ((Limg(r,c) - Lin) / (Hin - Lin))^gamma;
elseif (Limg(r,c) > Lin)
enhanceImg(r,c) = Hout;
else
enhanceImg(r,c) = Lout;
end
end
end
Lin, Hin, Lout, Hout, gamma are scalar values.
  1 commentaire
Greg
Greg le 6 Sep 2018
+1 for a very well formed question. Clear and concise, showed an attempt, and described relevant variable sizes.
That all makes it much easier to answer.

Connectez-vous pour commenter.

Réponse acceptée

Greg
Greg le 6 Sep 2018
Modifié(e) : Greg le 6 Sep 2018
Most of that is straightforward, just a couple elementwise periods for safety. Then, the hardest part is getting the logic to put the right values into your output matrix.
%%%Pre-allocate to Lout saves one round of comparison + assignment
enhancedImg = Lout.*ones(rows,cols);
%%%Build a mask for your first if condition
blnOne = (Lin <= Limg) & (Limg <= Hin);
%%%Assign the arithmetic result to elements behind that mask
enhancedImg(blnOne) = Lout+(Hout-Lout).*((Limg(blnOne)-Lin)./(Hin-Lin)).^gamma;
%%%Another mask for the elseif condition
blnTwo = Limg > Lin;
%%%Assign Hout to those elements
enhancedImg(blnTwo) = Hout;
%%%As mentioned above, all remaining elements are already Lout, so no "else" condition is needed
EDIT: Fixed Limg(blnOne) per first comment below.
  4 commentaires
Jae Min Lee
Jae Min Lee le 6 Sep 2018
Thank you very much!
Greg
Greg le 6 Sep 2018
Happy to help.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Programming dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by