【问题标题】:Matlab dynamic fieldnames structure with cell arraysMatlab动态字段名结构与单元阵列
【发布时间】:2011-11-27 15:15:40
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • refxtree.(fields{:}) 即使里面没有元胞数组也不起作用。

标签: matlab structure


【解决方案1】:

您需要为subsref 构建适当的输入,可能使用substruct。查看 MATLAB 帮助。

【讨论】:

【解决方案2】:

您可以定义一个匿名函数来导航这种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 需要有七个元素。如果要概括以上内容,则必须动态创建上述函数

【讨论】:

    【解决方案3】:

    在这种情况下,只使用 EVAL 会更容易:

    str = 'refxtree.CaseDefinition.FlowSheetObjects.MaterialStreamObjects{8}.MaterialStreamObjectParams.Pressure.Value.Text';
    
    %# get
    x = eval(str)
    
    %# set
    evalc([str ' = 99']);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 2011-02-17
      相关资源
      最近更新 更多