2017-01-27 9 views
0

Matlab Profilerを使用すると、このコード行が大きなボトルネックとなり、プログラムが遅くなることがわかりました。 wxyzは、AがBと等しくなく、同じ次元(A×B×C)を含むすべての3D行列です。このコード行を最適化して高速化する方法はありますか?この統合コードをmatlabでどのように最適化できますか?

dt = .5; 

for t = 1: tstop 
    w(:,:,t+1)= sum(dt*(x(:,:,t:-1:1).*(y(:,:,1:t) - .002).*z(:,:,1:t)),3); 
end 

答えて

0

あなたはforループ外のいくつかの用語のグループは、あなたが2xブーストまで得ることができる場合:我々は畳み込みxpを計算していることに気づくために

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]); 

結果は同じであり、ABCに依存し、これはあなたに大きなパフォーマンスの向上を与えることができます。 A=13B=14C=1155を持つ例:

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

はありがとうございました!これは信じられないほど役に立ちます:) –

関連する問題