Как я могу динамически получить доступ к полю поля структуры в MATLAB? - PullRequest
5 голосов
/ 20 сентября 2010

Меня интересует общая проблема доступа к полю, в котором может быть скрыто произвольное количество уровней в глубине вмещающей структуры.Ниже приведен конкретный пример использования двух уровней.

Допустим, у меня есть структура toplevel, которую я определяю из командной строки MATLAB следующим образом:

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

Я могу получить доступ к *Структура 1007 *, передавая имя поля в виде строки, например:

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

, но я не могу получить доступ к структуре bottomlevel таким же образом - следующий синтаксис недопустим:

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

Я мог бы написать функцию, которая просматривает периоды fieldnameToAccess и затем рекурсивно перебирает, чтобы получить желаемое поле, но мне интересно, есть ли какой-нибудь умный способ использовать встроенные модули MATLAB, чтобы просто получить значение полянепосредственно.

1 Ответ

9 голосов
/ 20 сентября 2010

Для вашего примера вам придется разбить доступ к динамическому полю на два шага, например:

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

value =

foo

Однако есть способ обобщить это решение для строки с произвольным числомподполя, разделенные точками.Вы можете использовать функцию TEXTSCAN для извлечения имен полей из строки и функцию GETFIELD для выполнения рекурсивного доступа к полю за один шаг:

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

value =

foo
...