如何在MATLAB中动态访问结构字段的字段?

Mar*_*arc 5 matlab matlab-struct

我对访问一个字段的一般问题很感兴趣,该字段可能埋藏在包含结构中的任意数量的级别.下面是使用两个级别的具体示例.

假设我有一个结构toplevel,我在MATLAB命令行中定义了以下结构:

midlevel.bottomlevel = 'foo';
toplevel.midlevel = midlevel;
Run Code Online (Sandbox Code Playgroud)

我可以midlevel通过将字段名称作为字符串传递来访问结构,例如:

fieldnameToAccess = 'midlevel';
value = toplevel.(fieldnameToAccess);
Run Code Online (Sandbox Code Playgroud)

但我无法bottomlevel以相同的方式访问结构 - 以下是无效的语法:

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

我可以编写一个fieldnameToAccess查看句点的函数,然后递归迭代以获得所需的字段,但我想知道是否有一些聪明的方法来使用MATLAB内置函数来直接获取字段值.

gno*_*ice 9

您必须将动态字段访问分为两个步骤,例如:

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

value =

foo
Run Code Online (Sandbox Code Playgroud)

但是,有一种方法可以将此解决方案概括为具有由句点分隔的任意数量的子字段的字符串.您可以使用该功能TEXTSCAN提取从字符串和函数的字段名getfield命令来执行递归领域一步到位访问:

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

value =

foo
Run Code Online (Sandbox Code Playgroud)