2010-09-20 2 views
5

Mi interessa il problema generale di accedere a un campo che può essere seppellito un numero arbitrario di livelli in profondità in una struttura di contenimento. Un esempio concreto che utilizza due livelli è sotto.Come posso accedere dinamicamente a un campo di un campo di una struttura in MATLAB?

che ho una struttura toplevel, che definisco dalla riga di comando MATLAB con la seguente:

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

posso accedere alla struttura midlevel passando il nome del campo come una stringa, ad esempio:

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

ma non riesco ad accedere alla struttura bottomlevel allo stesso modo - la seguente sintassi non è valida:

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

Potrei scrivere una funzione che guarda attraverso fieldnameToAccess per periodi e poi scorre in modo ricorsivo per ottenere il campo desiderato, ma mi chiedo se c'è un modo intelligente di usare i built-in MATLAB per ottenere direttamente il valore del campo.

risposta

9

Si dovrà dividere il campo dinamico accedendo in due passaggi per il tuo esempio, come ad esempio:

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

value = 

foo 

Tuttavia, c'è un modo in cui si può generalizzare questa soluzione per una stringa con un numero arbitrario di sottocampi delimitato da punti. È possibile utilizzare la funzione TEXTSCAN per estrarre i nomi dei campi dalla stringa e la funzione GETFIELD per eseguire il campo ricorsiva accesso in un unico passaggio:

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

value = 

foo 
+0

Esiste un modo per aggiungere la fieldnameToAccess alla fine di una variabile, vale a dire . primo livello (i campi {1} {1}) (campi {1} {2}) = resample (GetField (primo livello, i campi {1} {:}), ...)..; in generale (senza sapere che ci sono solo 2 livelli)? – Jon