How to vectorize this code to eliminate nested For loops?

1 回表示 (過去 30 日間)
Jae Min Lee
Jae Min Lee 2018 年 9 月 6 日
コメント済み: Greg 2018 年 9 月 6 日
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 件のコメント
Greg
Greg 2018 年 9 月 6 日
+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.

サインインしてコメントする。

採用された回答

Greg
Greg 2018 年 9 月 6 日
編集済み: Greg 2018 年 9 月 6 日
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 件のコメント
Jae Min Lee
Jae Min Lee 2018 年 9 月 6 日
Thank you very much!
Greg
Greg 2018 年 9 月 6 日
Happy to help.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by