MATLABの構造のフィールドのフィールドに動的にアクセスするにはどうすればよいですか?
-
04-10-2019 - |
質問
私は、含有構造の深さのarbitrary意的な数のレベルに埋もれている可能性のあるフィールドにアクセスするという一般的な問題に興味があります。 2つのレベルを使用した具体的な例を以下に示します。
私には構造があるとします toplevel
, 、これをMATLABコマンドラインから次のように定義します。
midlevel.bottomlevel = 'foo';
toplevel.midlevel = midlevel;
アクセスできます midlevel
フィールド名を文字列として渡すことで構造、例:
fieldnameToAccess = 'midlevel';
value = toplevel.(fieldnameToAccess);
しかし、私はアクセスできません bottomlevel
同じ方法で構造 - 以下は有効な構文ではありません:
fieldnameToAccess = 'midlevel.bottomlevel';
value = toplevel.(fieldnameToAccess); %# throws ??? Reference to non-existent field 'midlevel.bottomlevel'
スルーを確認する関数を書くことができます fieldnameToAccess
期間中、その後、希望するフィールドを取得するために再帰的に反復しますが、Matlabビルトインを使用してフィールド値を直接取得する賢い方法があるかどうか疑問に思います。
解決
次のような、例のために、2つのステップにアクセスする動的フィールドを分割する必要があります。
>> field1 = 'midlevel';
>> field2 = 'bottomlevel';
>> value = toplevel.(field1).(field2)
value =
foo
ただし、期間ごとに描写された任意の数のサブフィールドを使用して、このソリューションを文字列に一般化する方法があります。関数を使用できます TextScan 文字列と関数からフィールド名を抽出する ゲットフィールド 1つのステップで再帰フィールドアクセスを実行するには:
>> fieldnameToAccess = 'midlevel.bottomlevel';
>> fields = textscan(fieldnameToAccess,'%s','Delimiter','.');
>> value = getfield(toplevel,fields{1}{:})
value =
foo
所属していません StackOverflow