簡體   English   中英

在MATLAB中加速循環的方法

[英]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在運行之前不會將代碼編譯成機器語言,這就是導致代碼變慢的原因。 內置函數如summean.*運算符在后台運行預編譯的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM