0

我有一个长向量,包含 > 100 万个条目,根据概率密度函数(高斯)分布。我只需要正值,这些我在下面的 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 中有更聪明的方法吗?

谢谢,奈尔斯。

4

3 回答 3

6

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

vals = normrnd(0, 1, N, 1);
vals(vals<0) = [];
于 2012-11-22T17:40:17.957 回答
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.
于 2012-11-22T17:42:00.987 回答
3

您的脚本运行缓慢的原因之一是您之前没有进行初始化final。因此,变量在循环内增长。如果您先验地知道变量的大小,请先初始化变量:

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 )
于 2012-11-22T17:42:04.370 回答