MATLABの構造のフィールドのフィールドに動的にアクセスするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3753642

  •  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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top