2010-09-20 5 views
5

Ich interessiere mich für das allgemeine Problem des Zugriffs auf ein Feld, das eine beliebige Anzahl von Ebenen tief in einer enthaltenden Struktur begraben kann. Ein konkretes Beispiel mit zwei Ebenen ist unten.Wie kann ich dynamisch auf ein Feld eines Feldes einer Struktur in MATLAB zugreifen?

Say I haben eine Struktur toplevel, die ich aus der MATLAB Befehlszeile mit der folgenden definieren:

midlevel.bottomlevel = 'foo'; 
toplevel.midlevel = midlevel; 

I kann Zugriff auf die midlevel Struktur, indem man die Feldnamen als Zeichenfolge, zum Beispiel:

fieldnameToAccess = 'midlevel'; 
value = toplevel.(fieldnameToAccess); 

aber ich kann die bottomlevel Struktur die gleiche Art und Weise nicht zugreifen - das folgende ist nicht gültig Syntax:

fieldnameToAccess = 'midlevel.bottomlevel'; 
value = toplevel.(fieldnameToAccess); %# throws ??? Reference to non-existent field 'midlevel.bottomlevel' 

Ich könnte eine Funktion schreiben, die für einen Zeitraum und wiederholt sich dann rekursiv durchzukommen das gewünschte Feld durch fieldnameToAccess aussieht, aber ich frage mich, ob es eine kluge Art und Weise ist nur direkt den Feldwert erhalten zu MATLAB eingebaute Funktionen zu verwenden.

Antwort

9

Sie würden das dynamische Feld in zwei Schritten Zugriff für Ihr Beispiel teilen haben, wie zum Beispiel:

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

value = 

foo 

Allerdings gibt es eine Möglichkeit, Sie diese Lösung für eine Zeichenfolge mit einer beliebigen Anzahl von Subfeldern verallgemeinern durch Punkte begrenzt. Sie können die Funktion TEXTSCAN verwenden, um die Feldnamen aus der Zeichenfolge zu extrahieren und die Funktion GETFIELD die rekursive Feld in einem Schritt den Zugriff auszuführen:

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

value = 

foo 
+0

Gibt es eine Möglichkeit, die fieldnameToAccess bis zum Ende einer Variablen anhängen, dh . Toplevel. (Felder {1} {1}). (Felder {1} {2}) = resample (getfield (Toplevel, Felder {1} {:}), ...); im Allgemeinen (ohne zu wissen, dass es nur 2 Ebenen gibt)? – Jon

Verwandte Themen