更新: 这是一个已知的错误- 链接需要登录到 Mathworks 才能访问它。
错误报告摘要
如果使用版本 7.6 (R2008a) 保存到 MAT 文件中的 MATLAB 用户定义类的其中一个属性值是不同 MATLAB 类的实例,则该实例可能无法正确加载。
简而言之,Mathworks 报告以前保存的顶级自定义对象可能加载不正确(如下所述),并且错误发生在 SAVE 步骤中。因此,MAT 文件中的数据已损坏。
根据我的经验,这似乎是断断续续的。在一个数据分析应用程序中,我写了 75 个 MAT 文件,其中 37 个保存了这种损坏:(
小心用户定义的对象。我在保存时添加了以下测试以确保数据没有损坏
save('MAT_file_name.mat');
tmp=load('MAT_file_name.mat');
if ~isa(tmp.bb,'superClass')
msgbox({'THE FILE WAS NOT SAVED PROPERLY', ...
' ', ...
[' MAT_file_name.mat',]})
end
原始问题
这里我使用的是 MATLAB 2008a。这个微妙的错误已在 MATLAB-2009a 中修复。无论如何,我的两个类的定义方式,保存/加载循环导致一个类(superClass)的变量被加载为我的第二个类(propClass)的变量。
示例 MATLAB (r2008a) 会话
>> bb=superClass;
>> whos
Name Size Bytes Class Attributes
bb 1x1 60 superClass
>> save
>> clear
>> clear classes
>> load
>> whos
Name Size Bytes Class Attributes
bb 1x1 60 propClass
加载 matlab.mat 后,变量bb神秘地从 superClass 变为 propClass
类:超类
这个类需要包含一个 propClass 类型的数组,这是它的朴素定义
classdef superClass<handle
properties(SetAccess=private)
a = propClass.empty % need to set this property as type propClass
% otherwise the addProp method throws an error
count=0;
end
methods
function self=superClass
%empty class definitionS
end
function addProp(self)
p = propClass;
self.count = self.count+1;
self.a(self.count)=p;
end
end
end
类:道具类
PropClass 是超类使用的第二个类。它的定义对于这个错误并不重要。
问题
那么,为什么在MATLAB-R2008a中加载操作后superClass被改为propClass呢?其次,如何更改superClass的定义以避免这种症状?
笔记
我在我写的一个更大的课程中遇到了这个症状,并缩小了问题的根源。我知道它发生在上面描述的 MATLAB 会话中,但似乎如果我将一个对象添加到 superClass 的属性数组中,那么问题就会消失。所以,如果我在保存之前调用 superClass.addProp,那么从superClass到propClass的奇怪变化就不会发生。