更新: これは既知のバグです。リンクにアクセスするには、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 への奇妙な変更は発生しません。