3

更新: 这是一个已知的错误- 链接需要登录到 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,那么从superClasspropClass的奇怪变化就不会发生。

4

1 回答 1

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

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

于 2009-03-25T05:02:57.260 回答