2013-05-10 19 views
0

我試圖節省一些計算時間。我正在使用衆所周知的Lucas Kanade算法進行一些圖像處理。本文的出發點是Baker/Simon從性能計算中排除矩陣元素

我正在做這個Matlab,我也使用背景substractor。我想讓substractor將所有背景設置爲0或者有一個邏輯掩碼,其中前景爲1,背景爲0。

我想要的是排除所有從計算背景的矩陣元素。我的目標是節省計算時間。我知道我可以使用類似語法

A(A>0) = ... 

但這在某種程度上像

B(A>0) = A.*C.*D 

,因爲我得到一個錯誤,無法正常工作:

在分配A( I)= B,B和I中的元素數量必須相同。

這可能是因爲A,B和C都在一起具有比只有矩陣A.多種元素

在C代碼我僅環基體和檢查像素的值爲0,並且繼續。在這種情況下,保存一大堆計算。

但是在matlab中,循環遍歷矩陣並不是很快。那麼是否有快速解決我的問題的方法?我無法在這裏找到足夠的答案來解決我的問題。

我的情況任何人都感興趣:我試圖使用健壯的錯誤函數,而不是二次方。

更新:

我嘗試以下方法來測試速度的建議通過@Acorbe:

function MatrixTest() 
n = 100; 
A = rand(n,n); 
B = rand(n,n); 
C = rand(n,n); 
D = rand(n,n); 

profile clear, profile on; 
for i=1:10000  
    tests(A,B,C,D); 
end 
profile off, profile report; 

function result = tests(A,B,C,D) 
    idx = (B>0); 

    t = A(idx).*B(idx).*C(idx).*D(idx); 
    LGS1a(idx) = t; 

    LGS1b = A.*B.*C.*D; 

和我的folloing結果與MATLAB的探查:

t = A(idx).*B(idx).*C(idx).*D(idx); 1.520 seconds 
LGS1a(idx) = t; 0.513 seconds 
idx = (B>0);  0.264 seconds 
LGS1b = A.*B.*C.*D; 0.155 seconds 

正如您所看到的,通過索引訪問矩陣的開銷遠遠超過

回答

0

以下情況如何?

mask = A>0; 

B = zeros(size(A)); % # some initialization 

t = A.*C.*D; 
B(mask) = t(mask); 

通過這種方式,您只需選擇需要的元素t。也許在計算中會有一些開銷,儘管在循環緩慢方面可能忽略不計。


編輯:

如果你想更快的速度,你可以嘗試它使用面膜到處更有選擇地進行。

t = A(mask).*C(mask).*D(mask); 
B(mask) = t; 
+0

感謝您的評論,但對於t = A. * C. * D我仍然會進行計算。這是我想要阻止的。也許我需要說A,B,C,D當然有相同的大小,而這些矩陣是相互依賴的。因此,如果我不需要A(x,y)處的元素,那麼我不需要在A(x,y)* C(x,y)* D(x,y)處進行計算。 你提到的這個開銷很重要,因爲我會做乘法數百次,我希望它們在Matlab中儘可能快。 – 2013-05-10 12:46:23

+0

@SebastianSchütze,請修改更新的答案。 – Acorbe 2013-05-10 13:08:49

+0

也更新了我的回答。 – 2013-05-10 13:35:11