我创建了一个结构体数组
data(1).field = 5;
data(2).field = 3;
data(3).field = -4;
...
我想通过访问以下内容来绘制其中一个字段:
data(:).field
我收到以下错误:
预计大括号或点索引表达式会输出一个结果,但实际有 1000 个结果。
是否可以不使用循环来获取数据?
尝试
getfield
像这样
getfield(S(:),field)
getfield
读取嵌套字段,如
S.f1.f2.f3
然后电话是
getfield(S,f1,f2,f3)
在此处查看完整的 MATLAB 帮助文件:
是否可以不使用循环来获取数据?
是的,有几种方法可以避免for循环获取数据。
为了避免for循环(只能逐级循环),可以通过方括号“[]”来完成,或者将matlab结构体数组转换为其他matlab内置数据类型(如
table
、cell
等),一般使用的函数是struct2table、struct2cell。
实际上是将逗号表达式转换为标量数组。有关如何使用逗号表达式的教程,请参阅以下链接中的讨论。
这实际上将结构体数组转换为另一种数据表示形式,子字段(子级别,通常是
fieldnames
函数返回的结果)仍然是标量结构体。
当你事先知道某一层的字段名时,你可以通过以上两种方式获取下一层的数据。
例如:
data(1).level1_a.level2_a = 5;
data(2).level1_a.level2_a = 3;
data(3).level1_a.level2_a = -4;
data(4).level1_a.level2_a = 8;
data(1).level1_b.level2_b = 2;
data(2).level1_b.level2_b = 3;
data(3).level1_b.level2_b = 7;
data(4).level1_b.level2_b = 10;
% get struct data, avoid for loops
level1Names = fieldnames(data)
level2Names = fieldnames(data(1).(level1Names{1}))
tbl = struct2table(data) % The column name is the name of level1.
value1 = [tbl.level1_a.level2_a] % get the data
value2 = [tbl.level1_b.level2_b] % get the data
cel = struct2cell(data) % 2*1*4 cell array