长矢量的有效迭代

时间:2012-11-22 17:37:27

标签: matlab vector loops

我有一个长矢量,包含> 100万个条目,根据概率密度函数(Gaussian)分布。我只需要正值,这些我在下面的MWE中找到

N = 1.5e6;
vals = normrnd(0, 1, N, 1);

final = [];
for i=1:length(vals)
    if(vals(i)>0)
        final = [final vals(i)];
    end
end

问题是这需要很长时间。在MatLAB中有更聪明的方法吗?

谢谢, 奈尔斯。

3 个答案:

答案 0 :(得分:6)

您可以在matlab中删除没有for循环的负数:

vals = normrnd(0, 1, N, 1);
vals(vals<0) = [];

答案 1 :(得分:3)

无需循环,只需选择正值。

final = vals( vals>0 );

修改 出于兴趣,我计划了两种方法。分配给新变量的速度大约是删除元素的两倍。也就是说,它们都非常快:

>> N = 1.5e6;
>> vals = normrnd(0, 1, N, 1);
>> tic; final = vals( vals>0 ); toc
Elapsed time is 0.020852 seconds.
>> tic; vals(vals<0) = []; toc
Elapsed time is 0.041709 seconds.

答案 2 :(得分:3)

您的脚本速度缓慢的原因之一是您之前没有初始化final。因此,变量在循环内部增长。如果您知道其大小 a priori

,请先初始化变量
N = 1.5e6;
vals = normrnd(0, 1, N, 1);

final = zeros(vals,1);
for i=1:length(vals)
    if(vals(i)>0)
        final(i) = vals(i);
    end
end

但是,主要原因是因为您正在使用循环,并且您可以使用逻辑索引来执行此操作:

final = vals( vals > 0 )