我经常发现自己在做这样的事情:
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');
并修改循环以填充向量槽而不是连接。
有没有办法预先分配一个向量,以便它可以随后保存结构或对象?
更新:受Azim 回答的启发,我只是颠倒了循环顺序。正如调试器确认的那样,首先处理最后一个元素会强制在第一次命中时预分配整个向量:
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
这要求由 MATLAB 返回的任何对象process()
都具有有效的零参数构造函数processedData
,因为 MATLAB在第一次使用真实对象写入它时进行初始化。
mlint
仍然抱怨可能的数组增长,但我认为那是因为它无法识别反向循环迭代......