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 ...