我試圖節省一些計算時間。我正在使用衆所周知的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
正如您所看到的,通過索引訪問矩陣的開銷遠遠超過
感謝您的評論,但對於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
@SebastianSchütze,請修改更新的答案。 – Acorbe 2013-05-10 13:08:49
也更新了我的回答。 – 2013-05-10 13:35:11