罗兰谈MATLAB的艺术

将想法转化为MATLAB

重命名结构数组中的字段

我是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

结论

我的猜测是,在大多数情况下,前两节中使用的不交易技巧是最有效的,尽管我没有做任何分析。在这些代码中,代码当然是最干净的。你怎么看?有没有更好的办法?让我知道在这里




使用MATLAB®7.10发布

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。