为什么我的MATLAB(R2008a)对象的类在保存/加载循环中发生变化?

时间:2009-03-25 04:30:06

标签: matlab matlab-class

更新 这是一个已知的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 的奇怪更改。

1 个答案:

答案 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

我不确定它会产生任何影响,但这是我唯一能想到的尝试。希望能帮助到你! =)