加载包含结构的巨大单元阵列

时间:2018-11-14 16:30:23

标签: matlab mat-file

我在Matlab中保存和加载海量数据集时遇到问题。

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

关于如何解决这个问题,他们有什么建议吗? 是否有比-v7.3格式更好和有效的保存MAT文件的方法?

1 个答案:

答案 0 :(得分:0)

一种解决方案是使用regionprops的{​​{3}}参数。这将导致输出为table而不是结构数组。这种格式比struct数组存储效率更高。

更好的是,如果您不介意手动跟踪什么数据在哪里,那就用相关数据创建一个数值数组:

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                

数字数组是一种比struct数组更有效的数据存储方式,因为struct数组中的每个元素都是单独的矩阵,需要自己的标头。标头(我认为是114个字节)远大于数组中存储的值(本例中是8个字节),因此开销为31872 / 2112 = 15.1

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

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