5

我经常发现自己在做这样的事情:

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仍然抱怨可能的数组增长,但我认为那是因为它无法识别反向循环迭代......

4

3 回答 3

5

除了Azim 的回答之外,另一种方法是使用repmat

% Make a single structure element:
processedData = struct('field1',[],'field2',[]);
% Make an object:
processedData = object_constructor(...);
% Replicate data:
processedData = repmat(processedData,1,nElements);

其中nElements是结构或对象数组中的元素数量。

注意:如果您正在制作的对象是从句柄类派生的,您将不会复制对象本身,只需处理对它的引用。根据您的实现,您可能需要nElements多次调用对象构造函数方法。

于 2009-02-26T18:18:38.027 回答
3

由于您知道结构的字段processedData并且知道它的长度,因此一种方法如下:

unprocessedData = fetchData();
processedData = struct('field1', [], ...
                       'field2', []) % create the processed data struct
processedData(length(unprocessedData)) = processedData(1); % create an array with the required length
for dataIdx = 1:length(unprocessedData)
    processedData(dataIdx) = process(unprocessedData(dataIdx));
end

这假定该process函数返回一个与 具有相同字段的结构processedData

于 2009-02-26T17:33:12.923 回答
3

您可以传入struct适当大小的元胞数组:

processedData = struct('field1', cell(nElements, 1), 'field2', []);

这将创建一个与元胞数组大小相同的结构体数组。

于 2009-03-02T16:37:56.050 回答