如何使用动态字段名访问以下结构路径:
var = 'refxtree.CaseDefinition.FlowSheetObjects.MaterialStreamObjects{8}.MaterialStreamObjectParams.Pressure.Value.Text';
fields = textscan(var,'%s','Delimiter','.');
refxtree.(fields{:})
不起作用,因为MaterialStreamObjects包含我想要访问第8个单元格的单元格数组,然后继续沿结构路径行进。
最后我想得到并设置字段值。
答案 0 :(得分:0)
您需要为subsref
构建适当的输入,可能使用substruct
。查看MATLAB帮助。
答案 1 :(得分: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
需要有七个元素。如果要概括上述内容,则必须动态创建上述函数
答案 2 :(得分:0)
在这种情况下,使用EVAL更容易:
str = 'refxtree.CaseDefinition.FlowSheetObjects.MaterialStreamObjects{8}.MaterialStreamObjectParams.Pressure.Value.Text';
%# get
x = eval(str)
%# set
evalc([str ' = 99']);