0

データから得られる変数のリストに基づいてクラスを作成しました。このクラスのオブジェクト内にすべてのデータを配置する関数を作成しました。

変数のリストが大きくなるにつれて、クラスとロード関数を調整しなければなりません。クラスの変更に対して負荷関数を堅牢にする方法を見つけようとしています。

クラスファイルのコード:

classdef CoolClass
    properties
        prop_a
        prop_b
        prop_c
    end
end

このデータをオブジェクトにロードするために私が書いた関数:

function [ object_name ] = loadCoolClass (data_file_name)

    load(data_file_name) 
    % this loads the variabels: 
    % prop_a = 1, prop_b = 2, prop_c = 3, prop_d = 4

    object_name = CoolClass;

    object_name.prop_a = prop_a;
    object_name.prop_b = prop_b;
    object_name.prop_c = prop_c;
end

今私が欲しいのは、変数prop_dをclassdefファイルに追加すると、すぐにロードファイルにもロードされるということです。このようなもの:

function [ object_name ] = loadCoolClass (data_file_name)

    load(data_file_name) 
    % this loads the variabels: 
    % prop_a = 1, prop_b = 2, prop_c = 3, prop_d = 4

    object_name = CoolClass
    cool_properties = properties(CoolClass)

    for i = 1:size(cool_properties,2)
        object_name.cool_property(i) = cool_property(i)
    end
end

上記のループが有効なコードではないことはわかっていますが、つまり、すべてのプロパティをチェックして、その名前の変数があるかどうかを確認し、それをオブジェクトに配置します。

文字列の内容にちなんで名付けられた変数の値をロードするための入力として、文字列を保持する変数を使用する方法はmatlabにありますか?

これは、'=' 記号の前にコンテンツを命名することで可能ですか? '=' 記号の後に変数を参照することでこれは可能ですか?

4

2 に答える 2

3

私の経験では、これを行う最も簡単なhgsetget方法は、クラスを のサブクラスにすることです。これにより、グラフィック オブジェクトの場合set(obj, 'Key', value)get(obj, 'Key', value)同じように を使用することができます。

cls = CoolClass();
set(cls, 'prop_a', 1)

2 番目のステップは、出力先を指定することloadです(データをワークスペースにダンプするだけではなく)。これにより、ファイル内の各変数のフィールドを持つ構造体が得られます。これは、ワークスペースを整理するために、ファイルからロードするときに推奨されます。

さて、サブクラス化の本当のhgsetget利点は、プロパティ/値の aをandに渡すことできることstructです!setget

classdef CoolClass < hgsetget
    properties
        prop_a
        prop_b
    end
end

data.matの値を含むprop_aファイルがある場合は、prop_bこれを行うことができます。

cls = CoolClass();
data = load('data.mat')

    prop_a: 1
    prop_b: 2

set(cls, data)

data.matクラスのプロパティではない変数が含まれている場合は、これらを簡単に除外して引き続き使用できますset

toremove = setdiff(fieldnames(data), props);
set(cls, rmfield(data, toremove);

より良い例

私が個人的に行うことは、同じ入力set(つまり、構造体またはパラメーター/値のペア) を受け入れるコンストラクターを作成し、コンストラクター内でそれらを直接 に渡すことsetです。loadobjまた、本質的に構造体を入力として受け入れる静的メソッドであるクラスのメソッドを実装することもでき ます。そのメソッド内ですべての検証を実行して、不要なフィールドを削除できます。

classdef CoolClass < hgsetget
    properties
        prop_a
        prop_b
    end

    methods
        function self = CoolClass(varargin)
            set(self, varargin{:});
        end
    end

    methods (Static)
        function obj = loadobj(S)
            obj = CoolClass();

            % Remove any invalid fields
            toremove = setdiff(fieldnames(S), properties(cls));
            set(obj, rmfield(S, toremmove))
        end
    end
end

これで、以前とは異なる 2 つの方法でこのクラスを使用できるようになりました。

cls = CoolClass(load('data.mat'));
cls = CoolClass.loadobj(load('data.mat'));
于 2016-03-15T13:53:47.330 に答える
-3

あなたがやろうとしていることが理にかなっているのかどうかはわかりませんが、関数 eval を探していると思います: object_name.cool_property(i) = eval(cool_property(i))

于 2016-03-15T13:30:44.967 に答える