+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 все еще жалуется на возможный рост массива, но я думаю, что это потому, что он не может распознать обратную итерацию цикла

Ответы на вопрос(3)

Ваш ответ на вопрос