Matlab dynamic fieldnames structure with cell arrays

本秂侑毒 提交于 2019-12-10 19:19:58

问题


How can i access the following structure path with dynamic fieldnames:

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

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

refxtree.(fields{:}) does not work because MaterialStreamObjects contains a cell array of which I want to access the 8th cell and then continue down the structure path.

In the end I want to get and set the fieldvalues.


回答1:


You need to build the appropriate input to subsref, possibly using substruct. Look at the MATLAB help.




回答2:


You can define an anonymous function to navigate this particular kind of structure of the form top.field1.field2.field3{item}.field4.field5.field6.field7 (as an aside: is it really necessary to have such a complicated structure?).

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

You use the functions by calling

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

Note that fields is required to have seven elements. If you want to generalize the above, you will have to dynamically create the above functions




回答3:


In this case, it is easier to just use EVAL:

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

%# get
x = eval(str)

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


来源:https://stackoverflow.com/questions/7596575/matlab-dynamic-fieldnames-structure-with-cell-arrays

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!