Я не уверен в предварительном распределении «случайного размера», но вы можете предварительно распределить его большими кусками, например, 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)=[];
Это не будетмаксимально быстрый, но, по крайней мере, намного быстрее, чем увеличение каждой итерации.Убедитесь, что выбрали a
подходящий;вы можете даже основать его как-то на доступном объеме оперативной памяти, используя memory
, и впоследствии обрезать излишки, так что вам вообще не придется выполнять трюк в цикле.
В качестве отступления: MATLAB работает на уровне столбцов, поэтому работа с матрицами выполняется быстрее.Т.е. сначала первый столбец, потом второй и тд.Для одномерного массива это не имеет значения, но для матриц это имеет значение.Поэтому я предпочитаю использовать list = rand(x,1)
, то есть в качестве столбца.
В этом конкретном случае не использовать этот циклический подход в любом случае, но использовать логическое индексирование :
list = rand(x,1);
list = list(list<rand(size(list)));