How to vectorize this code to eliminate nested For loops?
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
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 Kommentar
Greg
am 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.
Akzeptierte Antwort
Greg
am 6 Sep. 2018
Bearbeitet: Greg
am 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 Kommentare
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!