重命名结构数组中的字段
我是Matthew Simoneau, MathWorks的软件开发人员,专注于技术交流和社会计算。
我的朋友布莱恩·梅(Bryan May)是一名MATLAB程序员,前几天他打电话给我问了一个问题。他正在使用一个结构数组,并希望重命名其中一个字段。我浏览了一下文件,结果一无所获。MATLAB有一个setfield和一个rmfield,但不是“rename字段”。这让我开始思考用MATLAB实现这个的最好方法。
内容
创建一个样本结构数组
首先,让我们创建一个简单的结构数组。
清晰的一个(1)。foo = 1; a(1).bar =“一个”;(2)。foo = 2; a(2).bar =“两个”;(3)。foo = 3; a(3).bar =“三”;disp (a)
带字段的1x3结构数组:foo bar
使用STRUCT2CELL和CELL2STRUCT
第一个想到的技术是使用的组合struct2cell而且cell2struct.这里我们将结构转换为两个单元格数组,其中一个包含字段名f一个包含值v.我们在f并重命名它,然后把结构重新组合起来。
F = fieldnames(a);V = struct2cell(a);f {strmatch (“酒吧”f“准确”)} =“记者”;A = cell2struct(v,f);disp (a)
带字段的1x3结构数组:foo baz
使用列表展开和DEAL
经过深思熟虑,我想出了一个更“合适”的方法。逗号分隔的列表展开是MATLAB中一个强大的概念。我知道我可以用(:) .baz我可以用这个符号交易将它们分配回另一个以逗号分隔的列表。
[(:)。Qux] = deal(a(:).baz);A = rmfield(A,“记者”);disp (a)
带字段的1x3结构数组:foo qux
无需交易
Scott French向我指出,在MATLAB 7中交易已经没有必要了。
(一个。qux] = a.qux;A = rmfield(A,“qux”);disp (a)
带字段的1x3结构数组:foo quux
泛化
此外,Kenneth Eaton评论说,这种技术可以很好地使用动态字段名,在MATLAB 6.5中介绍。
奥德菲尔德=“quux”;newField =“corge”;[a.(newField)] = a.(oldField);a = rmfield(a,oldField);disp (a)
带字段的1x3结构数组:foo corge
结论
我的猜测是,在大多数情况下,前两节中使用的不交易技巧是最有效的,尽管我没有做任何分析。在这些代码中,代码当然是最干净的。你怎么看?有没有更好的办法?让我知道在这里.
- 类别:
- 结构
评论
如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。