[英]How can I optimize this integration code in matlab?
使用Matlab Profiler,我發現這行代碼造成了很大的瓶頸,並降低了我的程序速度。 w
, x
, y
, z
都是包含相同維度(A x B x C)的所有3D矩陣,其中A不等於B並且不等於C。是否有任何方法可以優化此代碼行以使其運行得更快?
dt = .5;
for t = 1: tstop
w(:,:,t+1)= sum( dt*(x(:,:,t:-1:1).*(y(:,:,1:t) - .002).*z(:,:,1:t)),3);
end
如果您在for
循環之外對某些術語進行分組,則最多可以提高2x
倍:
p = dt*(y - .002).*z;
for t = 1: tstop
w(:,:,t+1)= sum( x(:,:,t:-1:1).*p(:,:,1:t), 3);
end
現在更容易注意到我們正在計算沿第三維的x
和p
卷積 。 如果維度C
(或tstop
)很大,則可以嘗試內聯或優化這些卷積。
我會將3D矩陣重塑為2D,將前兩個維度分組,並將時間維度保留為第二個維度。 然后,你可以嘗試執行與逐行卷積 conv2
(如果可能的話,如權利這個答案 )的fft
。 假定tstop = C
,在下面找到帶有fft
(且零填充)的解決方案:
X = reshape(x, [A*B, C]); % reshape to 2D
Y = reshape(y, [A*B, C]);
Z = reshape(z, [A*B, C]);
P = dt*(Y - .002).*Z; % grouped terms
z__ = zeros(A*B, C); % zero-padding
W = real(ifft(fft([z__, X]').*fft([z__, P]'))'); % column-wise fft
W = [zeros(A*B, 1), W(:, 1:C)]; % first half
w = reshape(W, [A, B, C+1]);
結果是相同的,並且取決於A
, B
, C
,這可以大大提高性能。 例如A=13
, B=14
, C=1155
:
original: 1.026312 seconds
grouping terms: 0.509862 seconds
FFT: 0.033699 seconds
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.