Como posso pré-alocar um vetor não numérico no MATLAB?

Muitas vezes me vejo fazendo algo assim:

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

O que, embora funcional, não é o ideal - oprocessedData vetor @ está crescendo dentro do loop. Atémlint avisa que eu deveria considerar pré-alocar velocidade.

Os dados eram um vetor deint8, Eu poderia fazer isso:

% preallocate processed data array to prevent growth in loop
processedData = zeros(length(unprocessedData), 1, 'int8');

e modifique o loop para preencher os slots de vetor em vez de concatena

xiste uma maneira de pré-alocar um vetor para que ele possa subsequentemente conter estruturas ou objeto

Atualizar inspirado por Resposta de Azim, Simplesmente inverti a ordem do loop. O processamento do último elemento primeiro força a pré-localização de todo o vetor na primeira ocorrência, conforme o depurador confirma:

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

Isso exige que qualquer objeto retornado porprocess() tem um construtor de zero-args válido desde que o MATLAB inicializaprocessedData na primeira gravação com objetos reai

mlint ainda reclama sobre o possível crescimento da matriz, mas acho que é porque não consegue reconhecer a iteração do loop invertido ...

questionAnswers(3)

yourAnswerToTheQuestion