Как неоднократно упоминалось в этой ветке, изменение размера массива очень интенсивно обрабатывается и может занять много времени.
Если время обработки не является проблемой:
Тогда что-то вроде упомянутого @Wolfie будет достаточно хорошим. На каждой итерации длина массива будет увеличиваться, а именно:
z = [];
for ii = 1:x
%z = [z; ii];
z(end+1) = ii % Best way
end
Если время обработки является проблемой:
Если время обработки является большим фактором, и вы хотите, чтобы оно работало как можно более плавно, вам необходимо предварительно выделить. Если у вас есть приблизительное представление о максимальном количестве итераций, которые будут выполняться, вы можете использовать предложение @PluginPenguin. Но все еще может быть изменение достижения этого заданного предела, что сломает (или сильно замедлит) программу.
Мое предложение:
Если ваш цикл работает бесконечно, пока вы его не остановите, вы можете время от времени изменять размер. По сути, увеличивайте размер по мере продвижения, но делайте это только время от времени. Например каждые 100 петель:
z = zeros(100,1);
for i=1:inf
z(i,1)=i;
fprintf("%d,\t%d\n",i,length(z)); % See it working
if i+1 >= length(z) %The array as run out of space
%z = [z; zeros(100,1)]; % Extend this array (note the semi-colon)
z((length(z)+100),1) = 0; % Seems twice as fast as the commented method
end
if(condition)%%condition is met then break out of the loop
break;
end;
end
Это означает, что цикл может работать вечно, массив будет увеличиваться вместе с ним, но только время от времени. Это означает, что время обработки попадания будет минимальным.
Изменить:
Как любезно упомянул @Cris, MATLAB уже делает то, что я предложил внутри. Это делает два моих комментария совершенно неверными. Так что лучше всего будет следовать тому, что сказали @Wolfie и @Cris:
z(end+1) = i
Надеюсь это поможет!
person
Hein Wessels
schedule
15.08.2018