加载包含结构的巨大单元格数组



我在Matlab中保存和加载一个巨大的数据集时遇到了问题。

我的数据集包含使用Matlab的regionprops的一系列图像的属性。我目前有一个大约21GB的MAT文件,这需要一段时间才能加载
此MAT文件有一个单元格数组,其中包含每个切片上椭圆属性的结构数组。

他们对如何绕过这个问题有什么建议吗?有没有比-v7.3格式更好、更有效的保存MAT文件的方法?

一种解决方案可以是对regionprops使用'table'参数。这将导致输出为table,而不是结构数组。这种格式的存储效率高于结构数组。

更好的是,如果您不介意手动跟踪数据的位置,可以使用相关数据创建一个数字数组:

BW = imread('text.png'); % Example image used in the docs
s = regionprops(BW,{'MajorAxisLength','MinorAxisLength','Orientation'});
t = regionprops('table',BW,{'MajorAxisLength','MinorAxisLength','Orientation'});
m = [s.MajorAxisLength; s.MinorAxisLength; s.Orientation];
whos
  Name        Size             Bytes  Class      Attributes
  BW        256x256            65536  logical              
  m           3x88              2112  double               
  s          88x1              31872  struct               
  t          88x3               3496  table                

数字数组是比结构数组更有效的存储数据的方法,因为结构数组中的每个元素都是一个单独的矩阵,需要自己的头。在这种情况下,头(我相信是114个字节(远远大于存储在数组中的值(在这种情况中是8个字节(,因此31872 / 2112 = 15.1的开销。

该表将每一列存储在一个单独的数组中,因此开销要小得多。您只有3个阵列,而不是3 x 88(特征数量x对象数量(阵列。

如果每个图像都保证具有相同数量的对象,则可以考虑将这些矩阵放入单个3D阵列中,而不是单元阵列中。这里的收益会更小。

最新更新