Matlab 优化两个嵌套for循环和if条件

Matlab 优化两个嵌套for循环和if条件,matlab,for-loop,optimization,Matlab,For Loop,Optimization,我有下面一段代码,它通过两个嵌套的for-循环运行,中间有一个if条件: N=1e4; cond_array = [0:(N/2-1) -N/2+(0:(N/2-1))]/(N); condition = 0.1; arr_one = zeros(N, 1); arr_two = zeros(N, 1); for m=1:N for k=1:N if(abs(cond_array(k)) <= condition) arr_one(m

我有下面一段代码,它通过两个嵌套的
for
-循环运行,中间有一个
if
条件:

N=1e4;

cond_array = [0:(N/2-1) -N/2+(0:(N/2-1))]/(N);
condition  = 0.1;

arr_one = zeros(N, 1);
arr_two = zeros(N, 1);

for m=1:N
    for k=1:N
        if(abs(cond_array(k)) <= condition)
            arr_one(m)  = arr_one(m)  + m*k;
        else
            arr_two(m)  = arr_two(m)  + m*k;
        end
    end
end
N=1e4;
cond_数组=[0:(N/2-1)-N/2+(0:(N/2-1))]/(N);
条件=0.1;
arr_one=0(N,1);
arr_two=零(N,1);
对于m=1:N
对于k=1:N

if(abs(cond_array(k))研究逻辑索引的使用。 如果不太了解您的代码,我可以想象您可以通过类似于下面的数组函数删除循环

arr_one(abs(cond_array)<condition)

arr\u one(abs(cond\u数组)研究逻辑索引的使用。
如果不太了解您的代码,我可以想象您可以通过类似于下面的数组函数删除循环

arr_one(abs(cond_array)<condition)
arr_one(abs(cond_array)这里有一种更快(且可读)的方法来获得相同的结果:

N=1e4;
cond_array = [0:(N/2-1) -N/2+(0:(N/2-1))]/(N);
condition  = 0.1;
% this is so you don't check the same condition multiple times:
cond = abs(cond_array)<=condition;
% a vector of the positions in 'arr_one' and 'arr_two':
pos = (1:N).';
% instead of m*k(1)+m*k(2)... use: m*sum(k):
k1 = sum(pos(cond)); % for arr_one
k2 = sum(pos(~cond));% for arr_two
% the final result:
arr_one = pos.*k1;
arr_two = pos.*k2;
arrayfun
不比
for
循环快,只是更紧凑。使用
for
循环如下:

arr_one = zeros(N,1);
arr_two = zeros(N,1);
for k = 1:N
    arr_one(k) = ek1(k);
    arr_two(k) = ek2(k);
end
下面是另一个更通用的选项,使用
bsxfun

ek = @(m,k) exp((m-1).*(k-1));
arr_one = sum(bsxfun(ek,1:N,k1)).';
arr_two = sum(bsxfun(ek,1:N,k2)).';
以下是获得相同结果的更快(且可读性更好)的方法:

N=1e4;
cond_array = [0:(N/2-1) -N/2+(0:(N/2-1))]/(N);
condition  = 0.1;
% this is so you don't check the same condition multiple times:
cond = abs(cond_array)<=condition;
% a vector of the positions in 'arr_one' and 'arr_two':
pos = (1:N).';
% instead of m*k(1)+m*k(2)... use: m*sum(k):
k1 = sum(pos(cond)); % for arr_one
k2 = sum(pos(~cond));% for arr_two
% the final result:
arr_one = pos.*k1;
arr_two = pos.*k2;
arrayfun
不比
for
循环快,只是更紧凑。使用
for
循环如下:

arr_one = zeros(N,1);
arr_two = zeros(N,1);
for k = 1:N
    arr_one(k) = ek1(k);
    arr_two(k) = ek2(k);
end
下面是另一个更通用的选项,使用
bsxfun

ek = @(m,k) exp((m-1).*(k-1));
arr_one = sum(bsxfun(ek,1:N,k1)).';
arr_two = sum(bsxfun(ek,1:N,k2)).';

arr\u one=(1:N)*sum(find(abs(cond\u array)优化工作代码实际上是目的,所以像这样的问题在那里非常受欢迎!:)
arr\u one=(1:N)*sum(find(abs(cond\u array)优化工作代码实际上是目的,所以像这样的问题在那里非常受欢迎!:)我不确定
arr\u one(N,1)=0;
是安全的,如果我没有弄错的话,你可能会在你的向量中有随机值。最好使用
零(N,1)
来确保安全。@如果是安全的,MATLAB启动一个零矩阵,你可以自己检查。试试
arr_one(k)
在初始化之后,使用小于
N的
k
函数,看看是否得到了非零的结果。好吧,我发现自MATLAB R2015b以来,零函数的速度更快。因此我编辑了我的答案。@EBH谢谢。如果最后一个术语
m*k
采用了更高级的形式,如
exp((m-1)*(k-1))@ BLYYJY?这是NATE比编程更重要,也是另一个问题的主题,但不管怎样,请看我的编辑。请,如果它解决了这个问题,考虑接受答案,如果你对具体的场景有进一步的问题-发布一个新的问题。我不确定是否<代码> ARLYONE(N,1)。=0;
是安全的,如果我没有弄错的话,你可能会在你的向量中有随机值。最好使用
零(N,1)
来确保安全。@如果是安全的,MATLAB启动一个零矩阵,你可以自己检查。试试
arr_one(k)
在初始化之后,使用小于
N的
k
函数,看看是否得到了非零的结果。好吧,我发现自MATLAB R2015b以来,零函数的速度更快。因此我编辑了我的答案。@EBH谢谢。如果最后一个术语
m*k
采用了更高级的形式,如
exp((m-1)*(k-1))@ BLYYJY?这是NATE比编程更重要,也是另一个问题的主题,但不管怎样,请看我的编辑。请,如果它解决了这个问题,考虑接受答案,如果你对具体场景有进一步的问题-发布一个新的问题。