我是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是標量。
我是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是標量。
可以分三個步驟做到這一點:
創造的因素的載體;使1 * 1通過-Z
fact = f .* bins.^(0:z-1);
fact = reshape(fact,1,1,[]);
因素
tmp = bsxfun(@times,floor(clip*bins/256),fact);
總和一切
binno = sum(tmp,3);
有時它有助於記下前幾個循環的值,然後找到該模式。向量F(每次迭代一次)從第一個f
開始(我們稱之爲f0
)。然後第二項是f0*bins
。然後f0*bins^2
等,所以F
是f0*[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);
只是注意...這個問題會更容易地與至少由大小定義了輸入回答。更好的是幾行生成正確尺寸的樣本數據。由於沒有,我無法測試上述代碼,所以您有責任將其適用於您的數據。
你能不能把一些大小澄清乘剪輯?我猜'clip'是3D,'binno'是2D矩陣,'f'和'bin'是標量? – 2013-02-26 17:56:39
@DedekMraz是的你是對的。我會更新這個問題。任何關於如何矢量化它的建議? – MaxSteel 2013-02-26 17:59:31