更新 这是一个已知的bug - 链接,需要登录Mathworks才能访问它。
错误报告摘要
用户定义的MATLAB实例 使用保存到MAT文件的类 版本7.6(R2008a)可能无法加载 如果其中一个属性值正确 是一个不同的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
Class:superClass
这个类需要包含一个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
PropClass是超类使用的第二个类。它的定义对于这个bug并不重要。
问题
那么,为什么在MATLAB-R2008a中加载操作后,superClass被改为propClass?其次,如何更改 superClass 的定义以避免出现此症状?
注意
我在我写过的一个更大的课程中遇到了这个症状并缩小了问题的根源。我知道它发生在上面描述的MATLAB会话中,但似乎如果我在superClass中向属性数组添加一个对象,那么问题就会消失。 因此,如果我在保存之前调用superClass.addProp,则不会发生从 superClass 到 propClass 的奇怪更改。
答案 0 :(得分:2)
这是一个奇怪的问题!我没有遇到过这样的事情,但你可以先尝试的一件事就是将属性的初始化移到构造函数中:
classdef superClass < handle
properties (SetAccess = private)
a
count
end
methods
function self = superClass
self.a = propClass.empty;
self.count = 0;
end
function addProp(self)
p = propClass;
self.count = self.count+1;
self.a(self.count) = p;
end
end
end
我不确定它会产生任何影响,但这是我唯一能想到的尝试。希望能帮助到你! =)