【问题标题】:pre-allocate cell array of objects预分配对象元胞数组
【发布时间】:2012-02-13 09:08:07
【问题描述】:

在 Matlab 中,我有一个名为“point”的类(它不是句柄类)。

我使用一个循环来创建一个由点组成的元胞数组,使其在每次迭代中增长而无需预分配:

    for k=1:npoints
      newpoint=point(*some parameters that depend on k*);
      pointcell{k}=newpoint; % pointcell grows at each iteration
    end

在此示例中,元胞数组“pointcell”在每次迭代时都会增长,这在性能方面可能不是最佳的。 预先分配这个单元格数组是否有用,如果是的话,如何做到这一点? 仅使用pointcell=cell(npoints) 似乎不起作用..

【问题讨论】:

    标签: oop matlab


    【解决方案1】:

    还可以考虑使用对象数组,而不是对象元胞数组。

    当您分配一个元胞数组时,您并没有真正帮助 Matlab 管理内存。那是因为每个单元格可以是任意大小,因此唯一可以预分配的是指针数组。 Check out this for more info on cell arrays.

    然后你可以通过repmat分配一个对象数组

    points = repmat(point(defaultVal1,defaultVal2,...),1,npoints);
    for k=1:npoints
        newpoint=point(*some parameters that depend on k*);
        points(k)=newpoint; % pointcell grows at each iteration
    end
    

    【讨论】:

      【解决方案2】:

      recommended way to pre-allocate a cell array 是以下之一:

      pointcell = cell(npoints);
      

      pointcell = {};
      pointcell{1, npoints} = [];
      

      【讨论】:

      • 实际上,就我而言,我似乎需要 pointcell=cell(npoints,1)
      【解决方案3】:
      pointcell = cell(npoints, 1);
      

      我建议坚持使用您的单元阵列方法。使用对象数组提到的其他答案之一;我不建议这样做!分配到预先分配的单元数组中很快,而分配到对象数组中则相对非常慢。我认为你已经有了正确的方法。

      【讨论】:

      • 感谢您的建议!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 2017-12-03
      相关资源
      最近更新 更多