我有一个对象来 self 用 Matlab 编写的某个类。当我使用“whos”命令确定它的大小时,它大约是 720,000 字节。当我将它保存在 .mat 文件中时,它大约需要 75MB。到底是怎么回事?
有没有一种在 Matlab 中保存和加载对象的有效方法?
编辑:这是属性及其大小的列表
CT_COL: 2 p: 5 d: 10 n: 37 N: 20 idx: [20x1 double] Am: [4-D double] X: [4-D double] y: [37x1 double] KGram: [20x20 double] reWave: [] rpw: 2 grps: [1x37 double] exIDX: [1 4 5 6 13] nCV: 100 prIDX: [100x6 double] trIDX: [100x26 double] U: [5x100 double] V: [10x100 double] B: [20x100 double] Yhat: [37x100 double] Lam: [100x1 double] peakRatio: [37x1 double]
Am 和 X 都是 20x10x5x37 数组( double )
顺便说一句,属性“reWave”用于保存另一个对象的方法句柄。我认为这可能不是一个好主意(并且可能会导致这种情况),所以我从类定义中删除了对它的任何提及。但它似乎以某种方式出现在属性集中。 (即使在我发布了“clear classes”之后。)
EDIT2:我正在使用命令 save('uvXbMod1.mat','ob')
只保存对象。令人费解的是:当我使用命令 whos -file uvXbMod1.mat
查看文件中保存的内容时,它显示
Name Size Bytes Class Attributes ob 1x1 680512 uvXbModel
(这是另一个例子,不是上面提到的那个。).mat 文件中还有什么让它变得那么大?
EDIT3:好的...问题似乎是我存储在两个 protected 属性中的两个内联函数句柄。只有这两个, @(X) median(abs(X),2)
和 @median
。句柄本身只有几个字节大小,我假设因为它们是内联函数,所以它们应该与它们的单行定义一起存储为文本(?)。但显然这并没有发生,它导致大量其他东西被一起存储(这在事实之后似乎并不奇怪......)
最佳答案
这是我在代码中发现的问题:
问题是我存储在两个 protected 属性中的两个 inline 匿名函数句柄。只有这两个,@(X) median(abs(X),2)
和 @median
。
句柄本身只有几个字节大小,我假设因为它们是内联 匿名函数,所以它们应该与它们的单行定义一起存储为文本。但显然这并没有发生,它会导致大量其他东西一起存储。
关于Matlab 对象在 .mat 文件中占用较大空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16205727/