2013-02-26 99 views
0

我是matlab新手。通過一個簡單的例子,我想了解矢量化。我如何矢量化下面的代碼片段。matlab簡單的矢量化實現

for i = 1:z 
    binno = binno + f*floor(clip(:,:,i)*bins/256); 
    f=f*bins; 
end 

這是一個非常簡單的代碼,但我也需要了解我怎麼能向量化它properly.Problem爲f在每個循環後重新計算。 編輯:Binno是一個2d矩陣,Clip是3d,f和bin是標量。

+0

你能不能把一些大小澄清乘剪輯?我猜'clip'是3D,'binno'是2D矩陣,'f'和'bin'是標量? – 2013-02-26 17:56:39

+0

@DedekMraz是的你是對的。我會更新這個問題。任何關於如何矢量化它的建議? – MaxSteel 2013-02-26 17:59:31

回答

3

可以分三個步驟做到這一點:

  1. 創造的因素的載體;使1 * 1通過-Z

    fact = f .* bins.^(0:z-1); 
    fact = reshape(fact,1,1,[]); 
    
  2. 因素

    tmp = bsxfun(@times,floor(clip*bins/256),fact); 
    
  3. 總和一切

    binno = sum(tmp,3); 
    
+0

在我最初的代碼中,如果我需要在循環結束後重用f的值,即循環中f的最終值,我該怎麼做? – MaxSteel 2013-02-28 13:15:03

+0

@Panther:你可以使用'fact(end)'來使用'f'的最終值。 – Jonas 2013-02-28 14:55:54

+0

有沒有可能得到不同的結果?另外我想獲得f的價值,因爲我在原始循環結束時獲得了原始循環。 – MaxSteel 2013-02-28 17:48:04

1

有時它有助於記下前幾個循環的值,然後找到該模式。向量F(每次迭代一次)從第一個f開始(我們稱之爲f0)。然後第二項是f0*bins。然後f0*bins^2等,所以Ff0*[1 bins bins^2 bins^3]... ,自垃圾箱^ 0爲1

即使在此之前可以被計算爲

F = f0 * bins .^ (0:z-1); 

,你能夠計算整個floor操作一次:floor(clip*bins/256)。現在您只需要弄清楚如何將P元素矢量F乘以該3D矩陣MxNxP。 bsxfun會做這樣的事情,但尺寸需要匹配,或者完全是1.因此,F必須是1x1xP而不是P.然後,將整個事物沿第三維進行求和。

binno = sum(bsxfun(@times, floor(clip*bins/256), reshape(F, [1 1 length(F)])), 3);

只是注意...這個問題會更容易地與至少由大小定義了輸入回答。更好的是幾行生成正確尺寸的樣本數據。由於沒有,我無法測試上述代碼,所以您有責任將其適用於您的數據。