3

更新: これは既知のバグです。リンクにアクセスするには、Mathworks にログインする必要があります。

バグ報告のまとめ

バージョン 7.6 (R2008a) を使用して MAT ファイルに保存された MATLAB ユーザー定義クラスのインスタンスは、そのプロパティ値の 1 つが別の 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 で修正されています。とにかく、私の 2 つのクラスが定義されている方法では、セーブ/ロード サイクルにより、1 つのクラス (superClass) の変数が 2 番目のクラス (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 型の配列を含める必要があり、これが Naive 定義です。

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 は、スーパー クラスによって使用される 2 番目のクラスです。その定義は、このバグにとって重要ではありません。

質問

では、MATLAB-R2008a でロード操作の後に superClass が propClass に変更されるのはなぜですか? 次に、この症状を回避するためにsuperClassの定義を変更するにはどうすればよいですか?

ノート

私が書いたより大きなクラスでこの症状に遭遇し、問題の原因を絞り込みました。上記の MATLAB セッションで発生することはわかっていますが、スーパークラスのプロパティ配列にオブジェクトを追加すると、問題が解消されるようです。したがって、保存する前に superClass.addProp を呼び出すと、superClass から propClass への奇妙な変更発生しません。

4

1 に答える 1

2

それは奇妙な問題です!私はそのようなものに出くわしたことはありませんが、最初に試すことができることの 1 つは、プロパティの初期化をコンストラクターに移動することです。

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 に答える