+1 Это хорошая альтернатива для создания структурных массивов, особенно если у вас уже есть массивы данных, которыми вы хотите заполнить поля.
то обнаруживал, что делаю что-то вроде этого:
unprocessedData = fetchData(); % returns a vector of structs or objects
processedData = []; % will be full of structs or objects
for dataIdx = 1 : length(unprocessedData)
processedDatum = process(unprocessedData(dataIdx));
processedData = [processedData; processedDatum];
end
Что, хотя и функционально, не оптимально -processedData
вектор растет внутри петли. Четныйmlint
предупреждает меня, что я должен рассмотреть возможность предварительного распределения скорости.
Были данные вектораint8
Я мог бы сделать это:
% preallocate processed data array to prevent growth in loop
processedData = zeros(length(unprocessedData), 1, 'int8');
и измените цикл, чтобы заполнить векторные слоты, а не объединять.
Есть ли способ предварительно выделить вектор, чтобы впоследствии он мог содержать структуры или объекты?
Обновить: вдохновленОтвет азимаЯ просто изменил порядок зацикливания. Обработка последнего элемента сначала вызывает предварительное выделение всего вектора в первом обращении, поскольку отладчик подтверждает:
unprocessedData = fetchData();
% note that processedData isn't declared outside the loop - this breaks
% it if it'll later hold non-numeric data. Instead we exploit matlab's
% odd scope rules which mean that processedData will outlive the loop
% inside which it is first referenced:
for dataIdx = length(unprocessedData) : -1 : 1
processedData(dataIdx) = process(unprocessedData(dataIdx));
end
Это требует, чтобы любые объекты, возвращаемыеprocess()
иметь действительный конструктор с нулевым аргументом так как MATLAB инициализируетprocessedData
на первом пишите с реальными объектами.
mlint
все еще жалуется на возможный рост массива, но я думаю, что это потому, что он не может распознать обратную итерацию цикла