罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

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

迭代非数值值

最近,一位同事希望编写一些代码来迭代结构中的字段。我能想到至少有三种不同的方法,有些比其他的更直接。这是我想到的。

内容

为示例创建数据

在这篇文章中,我只考虑标量结构。为了便于说明,本例中每个字段的内容也将是标量。我想创建一个输出,将每个条目的值增加1。

S.a = 1;S.b = 2;S.c = 3;

让我获得字段名,这样我就可以使代码具有合理的通用性。

Fn =字段名(s)
Fn = 'a' 'b' 'c'

第一个方法-循环多个字段名

在第一种情况下,我找出结构中有多少个字段,然后循环遍历每个字段,使用动态字段引用来访问每个字段中的值。

Out1 = 0(1,长度(fn));N = 1:length(fn) out1(N) = s.(fn{N}) + 1;结束着干活
Out1 = 2 3

第二个方法-遍历字段名称本身

在第二种情况下,我将绕过数字索引并循环遍历字段本身。自循环在MATLAB中一次处理一列的索引,我必须将我的字段名列转换为行向量。它恰好是一个单元格数组,因此我还必须将字段名转换为字符数组,以使用动态字段引用。我不会预分配输出out2这一次,但是允许这个小数组增长,所以我不需要在循环中添加计数器。

Out2 = [];STR = fn' out2(end+1) = s.(char(STR)) +1;结束out2
Out2 = 2 3

检查前两种方法的结果是否一致。

isequal(着干活,out2)
Ans = 1

第三种方法——使用structfun

使用。而不是循环遍历字段structfun迭代标量结构中的字段。

Out3 = structfun(@(x)x+1,s);Out3 = Out3。'
Out3 = 2 3

由于结果是作为列向量返回的,所以我将它们转置,以便将输出与其他方法的输出进行比较。检查最后两种方法的结果是否一致。

isequal (out2 out3)
Ans = 1

哪条路最清晰?

我已经向您展示了三种遍历结构中的字段的方法。你目前使用哪种方法?你觉得哪个更清楚?让我知道在这里




使用MATLAB®7.4发布


评论

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