poster
2019-12-10, 16:49
我经常发现自己在做这样的事情:
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的回答 (https://stackoverflow.com/questions/591495/matlab-preallocate-a-non-numeric-vector/591569#591569)启发,我只是颠倒了循环顺序。首先处理最后一个元素将在第一次命中时强制整个向量进行预分配,因为调试器确认:
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仍然抱怨数组可能增长,但是我认为这是因为它无法识别反向循环迭代...
回答:
由于您知道结构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函数返回相同的字段一个struct processedData 。
更多&回答... (https://stackoverflow.com/questions/591495)
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的回答 (https://stackoverflow.com/questions/591495/matlab-preallocate-a-non-numeric-vector/591569#591569)启发,我只是颠倒了循环顺序。首先处理最后一个元素将在第一次命中时强制整个向量进行预分配,因为调试器确认:
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仍然抱怨数组可能增长,但是我认为这是因为它无法识别反向循环迭代...
回答:
由于您知道结构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函数返回相同的字段一个struct processedData 。
更多&回答... (https://stackoverflow.com/questions/591495)