带元胞数组的 Matlab 动态字段名结构

发布于 2024-12-07 08:08:25 字数 353 浏览 1 评论 0原文

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

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

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

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

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

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦途 2024-12-14 08:08:25

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

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

宫墨修音 2024-12-14 08:08:25

您可以定义一个匿名函数来导航这种特殊类型的结构,其形式为 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 需要有七个元素。如果您想概括上述内容,则必须动态创建上述函数

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

是你 2024-12-14 08:08:25

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

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

%# get
x = eval(str)

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

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']);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文