2

いくつかの配列操作を実行するコードに問題があります。ループを使用しているため、遅くなりすぎています。私はしばらくの間、このコードを最適化し、ループを少なくするか、ループを使わずに書き直そうとしています。今まで失敗しました。私がこれを解決するのを手伝ってくれませんか:

YVal = 1:1:100000;
M_MAX = 1000;
N_MAX = 2000;
clear YTemp
tic
for M=1:1:M_MAX 
    for N = 1:1:N_MAX 
       YTemp(M,N) = sum(YVal (N+1:N+M)  ) - sum(YVal   (1:M)  );  
    end
end

大規模な場合N_MAXM_MAXこれら2つのループの実行時間は非常に長くなります。どうすればこれを最適化できますか?

ありがとうございました!

4

2 に答える 2

3

YValより大きいと仮定するとN_MAX+M_MAX

sum1 = cumsum( YVal(1:(M_MAX+N_MAX)) ); % sum1(M) = sum(YVal(1:M))

私が間違っていなければ、

sum( YVal( N+1:N+M ) ) = sum1( N + M ) - sum1( N )

したがって

YTemp( M, N ) = sum1( N + M ) - sum1( N ) - sum1( M )

使用するndgrid

[M N] = ndgrid( 1:M_MAX, 1:N_MAX );
YTemp = sum1( N + M ) - sum1( N ) - sum1( M );

私はそれを正しく理解しましたか?

編集:
別の行くなしndgrid

sum1 = cumsum( YVal( 1 : (N_MAX+M_MAX) ) );
YTemp = bsxfun( @minus, ...
            bsxfun( @minus, ...
                sum1( bsxfun( @plus, 1:N_MAX, (1:M_MAX)' ) ) , sum1 ),...
                    sum1' );
于 2013-01-28T15:41:26.323 に答える
2

不変項を内側のループから持ち上げることで、少しスピードアップできるはずです。

for M=1:1:M_MAX 
    sum2 = sum(YVal(1:M));
    for N = 1:1:N_MAX 
       YTemp(M,N) = sum(YVal(N+1:N+M)) - sum2;  
    end
end
于 2013-01-28T15:28:06.507 に答える