我可以预先分配一个非常大的细胞,它会长到一个未知的大小吗?

时间:2014-11-07 20:03:41

标签: arrays matlab matrix vector

我在for循环中有一个函数,这个函数接受一个图像并将其分解为输入图像所具有的组件数,范围从2到7.然后将这些单独保存到单元格中,因此如果输入图像有7个组件,它将产生一个7*1输出单元。

然后循环将从数据库中获取下一个图像,并执行相同操作并将该输出与前一个单元格连接起来。

最后,我看的是一个大约20,000 +的单元格大小。

我知道如果没有预先分配,这将是一个非常缓慢的过程,但是如何在不知道其大小的情况下初始化单元格呢?

2 个答案:

答案 0 :(得分:1)

方法#1

假设您知道要使用的图像数量,您可以预先分配最大尺寸的输出,因为您还知道任何图像的最大组件数7

这里是代码的嵌套循环部分,可以建议实现预分配和存储结果 -

output_cell = cell(7,num_images)
for iter1 = 1:num_images
    for iter2 = 1:num_components
        output_cell{iter1,iter2} = result;
    end
end

举个例子,让我们假设你运行了3个图像的代码,所以在代码运行之后你会留下这样的东西 -

output_cell = 
    [4x1 double]    [4x1 double]    [4x1 double]
    [2x1 double]    [2x1 double]    [2x1 double]
    [6x1 double]    [6x1 double]    [6x1 double]
    [2x1 double]              []    [2x1 double]
    [4x1 double]              []    [4x1 double]
              []              []    [4x1 double]
              []              []    [2x1 double]

之后,您可以使用此< - p>删除空单元格

>> output_cell(cellfun('isempty',output_cell))=[]

output_cell = 
  Columns 1 through 8
    [4x1 double]    [2x1 double]    [6x1 double]    [2x1 double]    [4x1 double]    [4x1 double]    [2x1 double]    [6x1 double]
  Columns 9 through 15
    [4x1 double]    [2x1 double]    [6x1 double]    [2x1 double]    [4x1 double]    [4x1 double]    [2x1 double]

因此,您将只留下有效单元格,其中包含1D单元格数组中所有图像的所有组件信息,这是您希望将其作为最终输出。


方法#2

这里没有你可以使用的预分配技术 -

output_cell = {}; Initialize as an empty cell array
for iter1 = 1:num_images
    for iter2 = 1:num_components
        output_cell{end+1} = result;
    end
end

这将为您提供一个1D单元格数组,就像在approach #1中一样。

答案 1 :(得分:0)

以块为单位分配,并具有固定/可变块步长。

首先说,您的块步长( M )为100.因此,在第一张图像之前,所有单元格的大小都为100.

如果在迭代过程中发现单元格空间不足,请将 M 更多元素分配给该单元格,依此类推。

第二种选择是找出哪些组件可能比其他组件更频繁地再次发生。如果您发现一个组件导致单元格大小非常快速增长,则仅为该特定组件增加M,并为该组件的单元分配更多元素。