代码之家  ›  专栏  ›  技术社区  ›  Dan Vinton

如何在matlab中预先分配非数字矢量?

  •  4
  • Dan Vinton  · 技术社区  · 16 年前

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

    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初始化 处理数据 第一次用真实的物体来写。

    莫林特 仍然抱怨可能的数组增长,但我认为这是因为它无法识别反向循环迭代…

    3 回复  |  直到 16 年前
        1
  •  3
  •   gnovice    8 年前

    因为你知道结构的领域 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 函数返回的结构的字段与 处理数据 .

        2
  •  4
  •   Community CDub    8 年前

    除了 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 ,您将不会复制对象本身,只需处理对它的引用。根据您的实现,您可能需要调用对象构造函数方法 N元素 时代。

        3
  •  3
  •   gnovice    8 年前

    可以将单元格数组传递给 struct 尺寸合适:

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

    这将生成与单元数组大小相同的结构数组。

    推荐文章