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

时间:2011-09-29 11:18:49

标签: matlab structure

如何使用动态字段名访问以下结构路径:

var = 'refxtree.CaseDefinition.FlowSheetObjects.MaterialStreamObjects{8}.MaterialStreamObjectParams.Pressure.Value.Text';

fields = textscan(var,'%s','Delimiter','.');

refxtree.(fields{:})不起作用,因为MaterialStreamObjects包含我想要访问第8个单元格的单元格数组,然后继续沿结构路径行进。

最后我想得到并设置字段值。

3 个答案:

答案 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']);