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

Loading huge cell array containing structures

我在 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                

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

的开销

table 将每一列存储在一个单独的数组中,因此您的开销要小得多。您没有 3 x 88(特征数 x objects)数组,而是只有 3.

如果保证每张图片都有相同数量的objects,您可以考虑将这些矩阵放入单个 3D 数组而不是元胞数组中。这里的增益会小一些。