2011-04-28 194 views
0

在MATLAB中,向量化代碼比使用for循環要快。我一直在試圖做到這一點,但我不完全明白這是如何工作的。我希望有人能告訴我如何改進這兩個for循環和一個while循環與改變索引,所以我可以讓我的頭圍繞它。任何幫助將是一個驚人的。向量化循環

width= 700; 
height= 600; 
fg= zeros(height, width); 
for i= 1: height 
    for j= 1: width 
     fg(i, j) = 0; 
     while ((match== 0)&& (k<= M)) 
      if (w(i, j, rank_ind(k))>= thresh) 
       if (abs(u_diff(i, j, rank_ind(k)))<= D* sd(i, j, rank_ind(k))) 
        fg(i, j)= 0; 
        match= 1; 
       else 
        fg(i, j)= fr_bw(i, j); 
       end 
      end 
      k= k+ 1; 
     end 
    end 
end 

注意wu_diffsdrank_indfr_b都陣列

+0

請不要複製您的問題:MATLAB向量化的循環(http://stackoverflow.com/questions/5820229/ MATLAB的矢量化-for循環)。相反,您應該編輯原始問題以更好地反映您的問題。 – gnovice 2011-04-28 17:03:09

+0

我已重新發布最後一個問題令人困惑,代碼不正確我已標記爲要刪除並重新張貼正確的代碼,以便可以理解。 – user729506 2011-04-28 17:04:26

+0

@ user729506:你可以編輯你之前的問題,使其更清晰。如果您覺得以前的問題無法通過編輯挽救,那麼您可以自己刪除它,並暫停思考如何在再次發佈之前改進問題。 – abcd 2011-04-28 17:09:16

回答

1

讓我看看我是否理解正確的話:你要的fr_bw值複製到fg只有在u_diff沒有相應的值小於D*sd,並且w高於某個閾值,對不對?

在這種情況下,你可以重寫代碼的方式如下:

%# find where u_diff is larger than D*sd 
%# but not where there's any u_diff that is smaller than D*sd 
whereToCopy = any(w(:,:,rank_ind) >= thresh & ... 
    abs(u_diff(:,:,rank_ind)) > D*sd(:,:,rank_ind),3) & ... 
    ~any(w(:,:,rank_ind) >= thresh & ... 
    abs(u_diff(:,:,rank_ind)) <= D*sd(:,:,rank_ind),3); 

%# whereToCopy has 1 wherever we need to copy, and 0 elsewhere 
%# thus, create fg from fr_bw directly by multiplication 
fg = double(fr_bw) .* double(whereToCopy); 
+0

是的你是對的,這可能是一個非常愚蠢的問題,但我實現了你的代碼,謝謝你,但它返回一個錯誤:整數只能與同一類的整數或標量雙打組合。這個錯誤出現在行fg = fr_bw。* whereToCopy,在時間上。我錯過了一些愚蠢的事情嗎? – user729506 2011-04-28 17:15:40

+0

@ user729506:是的,你錯過了告訴我'fr_bw'不是雙重的。現在它應該工作。 – Jonas 2011-04-28 17:18:41

+0

我的歉意它仍然不起作用,但我認爲這是因爲我使用fr_bw擁有的rgb2gray函數。 fr_bw = rgbgray(fr)。 – user729506 2011-04-28 17:32:09