Matlab动态字段名结构与单元数组

3
如何使用动态字段名访问以下结构路径:
var = 'refxtree.CaseDefinition.FlowSheetObjects.MaterialStreamObjects{8}.MaterialStreamObjectParams.Pressure.Value.Text';

fields = textscan(var,'%s','Delimiter','.');
refxtree.(fields{:}) 无法工作,因为 MaterialStreamObjects 包含一个单元数组,我想访问第8个单元,然后继续沿着结构路径进行。

最终我想要获取并设置字段值。


即使其中没有单元数组,refxtree.(fields{:})也无法正常工作。 - Jonas
3个回答

0

您可以定义一个匿名函数来遍历这种形式的结构:top.field1.field2.field3{item}.field4.field5.field6.field7(顺便说一句:有必要使用如此复杂的结构吗?)。

getField = @(top,fields,item)top.(fields{1}).(fields{2}).(fields{3}){item}.(fields{4}).(fields{5}).(fields{6}).(fields{7})

setField = @(top,fields,item,val)subsasgn(top.(fields{1}).(fields{2}).(fields{3}){item}.(fields{4}).(fields{5}).(fields{6}),struct('type','.','subs',fields{7}),val);

通过调用函数来使用它们

fieldValue = getField(refxtree,fields,8);
setField(refxtree,fields,8,newFieldValue);

请注意,fields必须有七个元素。如果您想要将上述内容推广到更多情况,您需要动态创建上述函数。

0
在这种情况下,最好直接使用EVAL:
str = 'refxtree.CaseDefinition.FlowSheetObjects.MaterialStreamObjects{8}.MaterialStreamObjectParams.Pressure.Value.Text';

%# get
x = eval(str)

%# set
evalc([str ' = 99']);

0

你需要构建适当的输入到subsref,可能使用substruct。请查看MATLAB帮助文档。


这个答案中,提供了一个不错的例子展示了subsrefsubstruct函数,这个例子很可能可以被改进来实现问题所要求的功能。 - quazgar

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