Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab无环矩阵运算_Matlab_Loops_Optimization_For Loop_Matrix - Fatal编程技术网

Matlab无环矩阵运算

Matlab无环矩阵运算,matlab,loops,optimization,for-loop,matrix,Matlab,Loops,Optimization,For Loop,Matrix,我对执行某些数组操作的代码有问题。它变得太慢了,因为我正在使用循环。我尝试了一段时间来优化这段代码,并用更少或没有循环的方式重新编写它。直到现在都没有成功。你能帮我解决这个问题吗 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

我对执行某些数组操作的代码有问题。它变得太慢了,因为我正在使用循环。我尝试了一段时间来优化这段代码,并用更少或没有循环的方式重新编写它。直到现在都没有成功。你能帮我解决这个问题吗

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
这两个循环的执行时间非常长。我如何优化它


谢谢大家!

通过将不变项从内部循环中提升出来,您应该能够将其加速一点,例如

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

假设
YVal
大于
N\u MAX+M\u 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的另一个go

sum1 = cumsum( YVal( 1 : (N_MAX+M_MAX) ) );
YTemp = bsxfun( @minus, ...
            bsxfun( @minus, ...
                sum1( bsxfun( @plus, 1:N_MAX, (1:M_MAX)' ) ) , sum1 ),...
                    sum1' );

你好谢谢你的回答。不过,我想了解如何在没有循环的情况下进行这些操作。我应该也能够计算向量,比如:YVal=rand(100000,1)。我看不到任何简单的方法来对这个循环进行向量化,但是比我更精通MATLAB的人可能会在适当的时候提供帮助。同时,您可以使用上述提升优化来潜在地节省一些执行时间,直到您得到更好的解决方案。最耗时的部分是循环内部的增长
YTemp
。用
YTemp=0(M_MAX,N_MAX)
替换
clear YTemp
,你会看到一个非常好的速度提升。@Jonas-这一点说得很好!请您详细说明一下在Matlab中预分配的重要性,并将其作为另一个答案发布在这里-我将为您+1!
sum1 = cumsum( YVal( 1 : (N_MAX+M_MAX) ) );
YTemp = bsxfun( @minus, ...
            bsxfun( @minus, ...
                sum1( bsxfun( @plus, 1:N_MAX, (1:M_MAX)' ) ) , sum1 ),...
                    sum1' );