2010-09-20 13 views
5

Me interesa el problema general de acceder a un campo que puede estar enterrado en un número arbitrario de niveles profundos en una estructura contenedora. Un ejemplo concreto usando dos niveles está abajo.¿Cómo puedo acceder dinámicamente a un campo de un campo de una estructura en MATLAB?

Digamos que tiene una estructura toplevel, que defino desde la línea de comandos de MATLAB con lo siguiente:

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

puedo acceder a la estructura midlevel pasando el nombre del campo como una cadena, por ejemplo:

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

pero no puedo acceder a la estructura bottomlevel la misma manera - los siguientes no es una sintaxis válida:

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

Podría escribir una función que se muestre a través de fieldnameToAccess por períodos y luego iterar recursivamente para obtener el campo deseado, pero me pregunto si hay alguna manera inteligente de utilizar MATLAB incorporados para obtener el valor del campo directamente.

Respuesta

9

Usted tendría que dividir el campo dinámico para acceder en dos pasos para tu ejemplo, tales como:

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

value = 

foo 

Sin embargo, hay una manera usted puede generalizar esta solución para una cadena con un número arbitrario de subcampos delimitado por puntos. Puede utilizar la función TEXTSCAN para extraer los nombres de los campos de la cuerda y la función GETFIELD para llevar a cabo el campo recursiva para acceder en un solo paso:

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

value = 

foo 
+0

¿Hay una manera de añadir el fieldnameToAccess al final de una variable, es decir, . toplevel. (fields {1} {1}). (fields {1} {2}) = remuestreo (getfield (toplevel, fields {1} {:}), ...); de manera general (sin saber que solo hay 2 niveles)? – Jon

Cuestiones relacionadas