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

8

我对访问可能被包含结构深度任意嵌套的字段的一般问题很感兴趣。下面是一个使用两个级别的具体示例。

假设我有一个名为toplevel的结构,我可以在MATLAB命令行中使用以下命令定义它:

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

我可以通过传递字段名称字符串来访问midlevel结构,例如:
fieldnameToAccess = 'midlevel';
value = toplevel.(fieldnameToAccess);

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

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

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

1个回答

13

对于你的例子,你需要将动态字段访问拆分为两个步骤,例如:

>> 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

有没有一种通用的方法可以将字段名称(fieldnameToAccess)附加到变量的末尾,例如 toplevel.(fields{1}{1}).(fields{1}{2})=resample(getfield(toplevel,fields{1}{:}),...);,而不知道它们只有两个级别? - Jon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接