Arrays 你能预先分配一个随机大小的数组吗?

Arrays 你能预先分配一个随机大小的数组吗?,arrays,matlab,pre-allocation,Arrays,Matlab,Pre Allocation,有关守则的主要部分可归纳为: list=rand(1,x); % where x is some arbitrarily large integer hitlist=[]; for n=1:1:x if rand(1) < list(n) hitlist=[hitlist n]; end end list(hitlist)=[]; list=rand(1,x);%其中x是任意大的整数 hitlist=[]; 对于n=1:1:x 如果兰德(1)

有关守则的主要部分可归纳为:

list=rand(1,x); % where x is some arbitrarily large integer
hitlist=[];
for n=1:1:x
    if rand(1) < list(n)
        hitlist=[hitlist n];
    end
end
list(hitlist)=[];
list=rand(1,x);%其中x是任意大的整数
hitlist=[];
对于n=1:1:x
如果兰德(1)<列表(n)
hitlist=[hitlist n];
结束
结束
列表(hitlist)=[];
这个程序运行得很慢,我怀疑这就是为什么,但是我不知道如何修复它。
hitlist
的长度必然会随机变化,因此我不能简单地预先分配一个适当大小的“零”。我打算把
hitlist
a
zero
作为我列表的长度,但是我必须删除所有多余的零,我不知道如何做才能避免同样的问题


如何预分配随机大小的数组?

我不确定是否预分配“随机大小”,但您可以预分配大块,例如
1e3
,或者对您的用例有用:

list=rand(1,x); % where x is some arbitrarily large integer
a = 1e3; % Increment of preallocation
hitlist=zeros(1,a);
k=1; % counter
for n=1:1:x
    if rand(1) < list(n)
        hitlist(k) = n;
        k=k+1;
    end
    if mod(k-1,a)==0 % if a has been reached
        hitlist = [hitlist zeros(1,a)]; % extend
    end
end
hitlist = hitlist(1:k-1); % trim excess
% hitlist(k:end) = []; % alternative trim, but might error
list(hitlist)=[];

我不相信以块的形式递增数组是可行的。您所做的一切都可能会降低JIT的速度。当您执行hitlist(end+1)=n时,MATLAB将使分配给数组的内存加倍(数组大小~=分配大小)。分块执行此操作不会让MATLAB优化此用例。问题在于执行
hitlist=[hitlist n]
,因为在那里您不扩展数组,而是创建一个新数组。我在某处有一个Q&a链接可以证明这一点,我会去寻找它。。阅读问题和我的答案,看看完整的实验。但是对于逻辑索引建议,无论如何+1。这是正确的方法。我会公开承认我的话。您以1e3的步长递增数组的方法略快于按命中列表(end+1)=n递增数组的方法。这两种方法都比OP的代码快一个数量级。当然,最后的版本,没有循环,比两种快速增加数组大小的方法都快两个数量级。
list = rand(x,1);
list = list(list<rand(size(list)));