我在for循环中有一个函数,这个函数接受一个图像并将其分解为输入图像所具有的组件数,范围从2到7.然后将这些单独保存到单元格中,因此如果输入图像有7个组件,它将产生一个7*1
输出单元。
然后循环将从数据库中获取下一个图像,并执行相同操作并将该输出与前一个单元格连接起来。
最后,我看的是一个大约20,000 +的单元格大小。
我知道如果没有预先分配,这将是一个非常缓慢的过程,但是如何在不知道其大小的情况下初始化单元格呢?
答案 0 :(得分: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单元格数组中所有图像的所有组件信息,这是您希望将其作为最终输出。
这里没有你可以使用的预分配技术 -
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,并为该组件的单元分配更多元素。