Loren谈MATLAB的艺术

将想法转化为MATLAB

请注意

Loren谈MATLAB的艺术已存档,不会更新。

重命名结构数组中的字段

我是Matthew Simoneau, MathWorks的软件开发人员,专注于技术交流和社会计算。

我的朋友Bryan May,一个偶尔的MATLAB程序员,有一天打电话给我问了一个问题。他正在处理一个结构数组,想要重命名其中一个字段。我扫描了一下文件,结果一无所获。MATLAB有一个setfield和一个rmfield,但不是“重命名字段”。这让我开始思考在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中交易已经没有必要了。

(一个。= 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发布

|
  • 打印
  • 发送电子邮件