あなたはfor
ループ外のいくつかの用語のグループは、あなたが2x
ブーストまで得ることができる場合:我々は畳み込みx
とp
のを計算していることに気づくために
p = dt*(y - .002).*z;
for t = 1: tstop
w(:,:,t+1)= sum(x(:,:,t:-1:1).*p(:,:,1:t), 3);
end
それは今より簡単に3次元に沿ってそのサイズがC
(またはtstop
)の場合は、その畳み込みをインラインまたは最適化することができます。
最初の2次元をグループ化し、時間を次元の2番目の次元に変更します。次に行方向の畳み込みをconv2
(可能であれば、this answerで請求されている)、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
はありがとうございました!これは信じられないほど役に立ちます:) –