matlab - 如何在 MATLAB 中预分配非数字向量?

标签 matlab matlab-struct pre-allocation

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

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's answer ,我只是颠倒了循环顺序。正如调试器确认的那样,首先处理最后一个元素会强制在第一次命中时预分配整个向量:

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

最佳答案

除了Azim's answer , 另一种方法是使用 repmat :

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

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

注意:如果您正在创建的对象是从 handle class 派生的,您不会复制对象本身,只需处理对它的引用。根据您的实现,您可能必须调用对象构造函数 nElements 次。

关于matlab - 如何在 MATLAB 中预分配非数字向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/591495/

相关文章:

matlab - 在 MATLAB 中转换矩阵

arrays - 你能预先分配一个随机大小的数组吗?

arrays - Modelica mos 脚本中数组大小的预分配

matlab - 访问结构体与 "loose"变量所需的时间

带有nans的python数组初始化(预分配)

matlab - 连接并从元胞数组中提取数据

arrays - 如何矢量化此代码?

matlab - 如何在Matlab中像在python和js中一样创建 'closure function'?

matlab - 如何使用两个单字段 Matlab 结构执行联合