¿Cómo puedo acceder dinámicamente un campo de un campo de una estructura en MATLAB?

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

  •  04-10-2019
  •  | 
  •  

Pregunta

Estoy interesado en el problema general de acceder a un campo que puede estar enterrado un número arbitrario de niveles de profundidad en una estructura que contiene. Un ejemplo concreto usando dos niveles está por debajo.

decir que tengo un toplevel estructura, 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 - lo siguiente no es válida la sintaxis:

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

Yo podría escribir una función que se ve a través fieldnameToAccess por períodos y luego recursivamente itera a través de llegar al campo deseado, pero me gustaría saber si hay alguna forma inteligente de utilizar MATLAB muebles empotrados para obtener sólo el valor del campo directamente.

¿Fue útil?

Solución

tendría que dividir el campo dinámico para acceder en dos pasos para tu ejemplo, 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 sub-campos delimitados por puntos. Puede utilizar la función de TextScan para extraer los nombres de los campos de la cuerda y la función getField para llevar a cabo el campo recursiva acceso en un solo paso:

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

value =

foo
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top