6

収容構造物の奥深くに任意の数のレベルが埋まっている可能性のあるフィールドにアクセスするという一般的な問題に興味があります。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'

ピリオドを調べてから再帰的に繰り返して目的のフィールドを取得する関数を作成することもできますが、fieldnameToAccessMATLAB組み込み関数を使用してフィールド値を直接取得する賢い方法があるかどうか疑問に思っています。

4

1 に答える 1

11

例では、動的フィールドアクセスを次の2つのステップに分割する必要があります。

>> field1 = 'midlevel';
>> field2 = 'bottomlevel';
>> value = toplevel.(field1).(field2)

value =

foo

ただし、ピリオドで区切られた任意の数のサブフィールドを持つ文字列に対してこのソリューションを一般化する方法があります。関数TEXTSCANを使用して文字列からフィールド名を抽出し、関数GETFIELDを使用して1つのステップで再帰的なフィールドアクセスを実行できます。

>> fieldnameToAccess = 'midlevel.bottomlevel';
>> fields = textscan(fieldnameToAccess,'%s','Delimiter','.');
>> value = getfield(toplevel,fields{1}{:})

value =

foo
于 2010-09-20T17:14:19.510 に答える