我有一个长矢量,包含> 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中有更聪明的方法吗?
谢谢, 奈尔斯。
答案 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 )