迭代非数值值
最近,一位同事希望编写一些代码来迭代结构中的字段。我能想到至少有三种不同的方法,有些比其他的更直接。这是我想到的。
内容
为示例创建数据
在这篇文章中,我只考虑标量结构。为了便于说明,本例中每个字段的内容也将是标量。我想创建一个输出,将每个条目的值增加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
哪条路最清晰?
我已经向您展示了三种遍历结构中的字段的方法。你目前使用哪种方法?你觉得哪个更清楚?让我知道在这里.
评论
如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。