簡體   English   中英

如何在Matlab中優化此集成代碼?

[英]How can I optimize this integration code in matlab?

使用Matlab Profiler,我發現這行代碼造成了很大的瓶頸,並降低了我的程序速度。 wxyz都是包含相同維度(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

現在更容易注意到我們正在計算沿第三維的xp 卷積 如果維度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]);

結果是相同的,並且取決於ABC ,這可以大大提高性能。 例如A=13B=14C=1155

original:       1.026312 seconds
grouping terms: 0.509862 seconds
FFT:            0.033699 seconds

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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