2016-05-18 7 views
3

handleとenumの両方を継承する次のクラスを作成しました。Matlabの保存ハンドルのインスタンスのプロパティ値が保存されません

classdef ShiftType < handle 
%SHIFTTYPE Defines shift per frame 
    properties 
     shift = 0 
     num_shifts = 0 
    end 
    enumeration 
     LateralCst %in meters 
     RadialCst % in radians 
     RadialVar % in beam distance ratio 
     LateralVar % Same. Lateral shift calculated at focus range. 
    end 
end 

私がShiftTypeのインスタンスを作成してスクリプト内で使用すると、すべてうまく行きます。しかし、私は、このインスタンスを.matファイルに保存して読み込むと、そのプロパティがデフォルト値(0)に設定されることに気付きました。

>> shift_type = ShiftType.RadialVar; 
>> shift_type.shift = 0.5; 
>> shift_type.num_shifts = 4; 
>> shift_type 

shift_type = 

    RadialVar 

>> shift_type.shift 

ans = 

    0.5000 

>> save test.mat shift_type 
>> clear all 
>> load test.mat 
>> shift_type 

shift_type = 

    RadialVar 

>> shift_type.shift 

ans = 

    0 

どのようにプロパティをShiftTypeインスタンスとともに.matファイルに保存することができますか? これらのプロパティはEnum型とは独立しているので、ShiftType(val)関数と各列挙型のデフォルト値(LateralCst(1,4)など)を持つだけではありません。

ありがとうございます!

+0

これを修正する方法はありません。「saveob」または「loadobj」のオーバーロードはenumでは不可能です。セーブ/ロード処理を操作する方法はわかりません。私はサポートに連絡することをお勧めします、それは間違いなくバグです。 – Daniel

答えて

1

ありがとうございます。私はMatlabにバグを報告しました。 その間、私はShiftTypeを2つのクラスに分割して問題を修正しました。 Shiftクラスは編集可能なプロパティを持つ汎用クラスです。そのうちの1つはbefore(ShiftType)の列挙型のインスタンスです。

classdef Shift 
%SHIFT Defines shift per frame 
properties 
    type = ShiftType.RadialVar; 
    val = 0; % Ref ShiftType 
    num_shifts = 0; 
end 
methods 
    function obj = Shift(type, val, num_shift) 
     obj.type = type; 
     obj.val = val; 
     obj.num_shifts = num_shift; 
    end 
end 
end 

そして:

classdef ShiftType 
%SHIFTTYPE Defines shift type 
enumeration 
    LateralCst %in meters 
    RadialCst % in radians 
    RadialVar % in beam distance ratio(1 = moves from one beam to another). 
    LateralVar % Same. Lateral shift calculated at focus range. 
end 
end 

私は、バグが修正されるまで、それが最も簡単な方法だと思います。 もう一度お返事ありがとうございました:)

1

おそらくバグです。 The documentationはあなたのクラスにこのメソッドを追加した場合、オブジェクトがしかし、ロードされたときに、プロパティのsetメソッドが呼び出されるべきであると述べている:

function set.shift(obj, shift) 
     obj.shift = shift; 
     disp('Set method called!'); 
    end 

あなたはそれが呼び出されていないことがわかります。クラスの列挙部分を削除すると、正常に動作します。列挙型の読み込みには、他のプロパティを考慮しない独自の処理があるようです。

0

ここに私が書いたものがあります。私はその完璧さを言わないでしょう。しかし、今は仕事が終わった。クラスファイル(Sameクラスファイル)に変更は必要ありません。このコードを実行するだけです

%% Initialise data 
shift_type = ShiftType.RadialVar; 
shift_type.shift = 0.5; 
shift_type.num_shifts = 4; 

%% save file 
file_name='test11.mat'; % write filename 
class_object='shift_type'; 
class_name=class(eval(class_object)); 
propNames=properties(class_name); 
data=cell(1,size(propNames,1)+1); 
data{1}=class_object; 
for index=2:size(propNames,1)+1 
    propertyName=strcat(class_object,'.',propNames{index-1}); 
    data{index}=[propNames(index-1) eval(propertyName)]; 
end 
save(file_name,class_object,'data'); 

%% clear workspace 
clear all; 

%% load file 
file_name='test11.mat'; %read filename 
load(file_name); 
for index=2:size(data,2) 
    property=data{index}; 
    propertyName=strcat(data{1},'.',property{1}); 
    expresn=strcat(propertyName,'=',num2str(property{2}),';'); 
    eval(expresn); 
end 

%% Display data 
shift_type.shift 
shift_type.num_shifts 
+0

あなたの解決に感謝します。私はそれを使用しません。なぜなら、コード内にセーブ/ロードを複数回実行するのは面倒です。私は2番目のクラスのファイルを必要とする別の解決策を提示しましたが、そのインスタンスを処理する上で問題はありません。 – Cyril

関連する問題