我在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阵列中,而不是单元阵列中。这里的收益会更小。