[英]Methods to speed up for loop in MATLAB
我剛剛介紹了我的MATLAB代碼,這個for循環有一個瓶頸:
for vert=-down:up
for horz=-lhs:rhs
y = y + x(k+vert.*length+horz).*DM(abs(vert).*nu+abs(horz)+1);
end
end
其中y,x和DM是我已定義的向量。 我通過寫作來矢量化循環,
B=(-down:up)'*ones(1,lhs+rhs+1);
C=ones(up+down+1,1)*(-lhs:rhs);
y = sum(sum(x(k+length.*B+C).*DM(abs(B).*nu+abs(C)+1)));
但最終變得足夠慢。
有關如何加快循環速度的建議嗎?
提前致謝。
你所做的並不是真正的矢量化。 在Matlab中編寫適當的圖像處理矢量化程序(我假設你正在做的事情)是非常困難的,如果不是不可能的話。 當我們使用術語矢量化時 ,我們的意思是“矢量化而無需額外的計算”。 例如,這段代碼
a = 1:1000000;
for i = a
n = n+i;
end
比這段代碼運行得慢得多
a = 1:1000000;
sum(a)
更新 :上面的代碼已被修改,感謝@ Rasman的強烈建議。 原因是Matlab在運行之前不會將代碼編譯成機器語言,這就是導致代碼變慢的原因。 內置函數如sum
, mean
和.*
運算符在后台運行預編譯的C代碼。 For循環是一個很好的代碼示例,在沒有針對CPU的寄存器進行優化時運行緩慢。
你做了什么,請忽略我的第一個評論,是用向量操作和一些額外的操作重寫你的程序。 這些操作需要額外的CPU,因為你告訴你的計算機要做更多的計算,即使每個計算單獨可能(或可能不)花費更少的時間。
如果您真的在加速編寫代碼,請查看MEX文件 。 它們允許您編寫和編譯C和C ++代碼,編譯它並作為Matlab函數運行,就像那些快速內置的代碼一樣。 無論如何,Matlab並不是一個快速的通用編程平台,而是一個計算機模擬環境,盡管這種方法近年來一直在變化。 我的建議(來自經驗)是,如果你進行圖像處理,你將編寫for循環,並且很少有辦法解決它。 向量運算是為了更直觀的線性代數問題而編寫的,我們很少將數字圖像視為常規矩形矩陣。
我希望這有幫助。
在處理圖像時我會使用矩陣......然后你可以試着像這樣提取子矩陣:
X = reshape(x,height,length);
kx = mod(k,length);
ky = floor(k/length);
xstamp = X( [kx-down:kx+up], [ky-lhs:ky+rhs]);
xstamp = xstamp.*getDMMMask(width, height);
y = sum(xstamp);
...
function mask = getDMMask(width, height, nu)
% I don't get what you're doing there .. return an appropriate sized mask here.
return mask;
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.