避免编写类似内容的最佳方法是什么
someDataStruct.longSubStructName.anotherLongName.theVariable = someStruct.longSubStructName.anotherLongName.theVariable + 10;
这太冗长,看起来也不可读。在Matlab中不带任何对象的最佳方法是什么?
答案 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)
有效。