В таких случаях мне нравится повторяться в обратном направлении, так как это вызывает полное выделение памяти при первом выполнении цикла. Тогда код будет выглядеть примерно так:
%Reset the structure
s = struct;
for ix = 97:-1:1
%Do stuff
%Store the data
s(ix).frame = ix;
s(ix).str = strength;
s(ix).freq = frequency;
end
Если один кадр зависит от следующего, или вы не знаете, сколько всего будет кадров, вы можете сканировать вперед. 97 кадров - это не много данных, так что вам, вероятно, не нужно слишком беспокоиться об оптимизации части проблемы, связанной с предварительным распределением.
%Reset the structure
s = struct;
for ix = 1:97
%Do stuff
%Store the data
s(ix).frame = ix;
s(ix).str = strength;
s(ix).freq = frequency;
end
Или, если вам действительно нужна производительность предварительно выделенного массива структур, но вы не знаете, насколько большим он будет в начале, вы можете сделать что-то вроде этого:
%Reset the structure
s = struct;
for ix = 1:97
%Do stuff
%Extend if needed
if length(s)<ix
s(ix*2).frame = nan; %Double allocation every time you reach the end.
end
%Store the data
s(ix).frame = ix;
s(ix).str = strength;
s(ix).freq = frequency;
end
%Clip extra allocation
s = s(1:ix);