在MATLAB中处理嵌套结构访问

时间:2018-08-17 05:41:22

标签: matlab

避免编写类似内容的最佳方法是什么

someDataStruct.longSubStructName.anotherLongName.theVariable =   someStruct.longSubStructName.anotherLongName.theVariable + 10;

这太冗长,看起来也不可读。在Matlab中不带任何对象的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

出于可读性考虑,您可以将其分成几行。

someDataStruct.longSubStructName.anotherLongName.theVariable   ...
=   someStruct.longSubStructName.anotherLongName.theVariable   ...
    + 10;

或通过临时变量

tmp = someStruct.longSubStructName.anotherLongName.theVariable + 10;
someDataStruct.longSubStructName.anotherLongName.theVariable = tmp;

如果您要这样做,Matlab并不真正支持“引用”(除非通过继承Handle类将其显式编码为类,但这是另一回事了)

很显然,您可以尝试涉及setfield / getfield和一系列对象的黑客程序,例如如果您至少捕获一次每个结构的theVariable的“路由”:

Var1 = {someDataStruct, 'longSubStructName', 'anotherLongName', 'theVariable'};
Var2 = {someStruct, 'longSubStructName', 'anotherLongName', 'theVariable'};

然后您可以在随后的 functional 调用中将其扩展,例如

setfield( Var1{:}, getfield( Var2{:} ) + 10 )

但是我不确定这一定是 more 可读的tbh;只是“较短”。

同样,您可以选择创建图形对象而不是普通结构,然后使用 做为常规对象,以捕获对子对象的引用并直接对其进行操作...但这又可能最终导致更多的混乱。

因此,基本上,只是硬着头皮使用临时变量。
它没有比matlab更具可读性。 :)

答案 1 :(得分:1)

根据matlab文档,如果不通过所有结构级别,就无法访​​问嵌套结构。也许您可以创建一个从中间层开始但违反Matlab原理的临时变量。

https://it.mathworks.com/help/matlab/matlab_prog/access-data-in-nested-structures.html

答案 2 :(得分:0)

只需向您的工具箱添加更多可能的语法,这段代码

someDataStruct.longSubStructName.anotherLongName.theVariable = 1;
someDataStruct.longSubStructName.anotherLongName.theVariable = ...
someDataStruct.longSubStructName.anotherLongName.theVariable + 10;

可以等同地写为

n = {'longSubStructName','anotherLongName','theVariable'}; # names
someDataStruct.(n{1}).(n{2}).(n{3}) = 1;
someDataStruct.(n{1}).(n{2}).(n{3}) = someDataStruct.(n{1}).(n{2}).(n{3}) + 10;

也;如果您使用不确定来源的字符串作为字段名称(例如,支持空格的HDF5属性名称和不支持Matlab结构字段名称的某些特殊字符),则可以确保它们与matlab.lang.makeValidName(fieldname)有效。