执行某些数组操作的代码存在问题。它变得太慢了,因为我正在使用循环。我正在尝试一段时间来优化此代码并使用较少或不使用循环重新编写它。直到现在都没有成功。能帮我解决一下这个问题:
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_MAX
和M_MAX
,这两个循环的执行时间非常长。我该如何优化呢?
谢谢!
答案 0 :(得分: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' );
答案 1 :(得分: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