Matlab数组结构

问题描述 投票:0回答:2

我创建了一个结构体数组

data(1).field = 5;
data(2).field = 3;
data(3).field = -4;
...

我想通过访问以下内容来绘制其中一个字段:

data(:).field

我收到以下错误:

预计大括号或点索引表达式会输出一个结果,但实际有 1000 个结果。

是否可以不使用循环来获取数据?

matlab matrix structure
2个回答
0
投票

尝试

getfield

像这样

getfield(S(:),field)

getfield
读取嵌套字段,如

S.f1.f2.f3

然后电话是

getfield(S,f1,f2,f3)

在此处查看完整的 MATLAB 帮助文件:

https://uk.mathworks.com/help/matlab/ref/getfield.html


0
投票

是否可以不使用循环来获取数据?

是的,有几种方法可以避免for循环获取数据。

为了避免for循环(只能逐级循环),可以通过方括号“[]”来完成,或者将matlab结构体数组转换为其他matlab内置数据类型(如

table 
cell
等),一般使用的函数是struct2tablestruct2cell


  • 使用“[]”

实际上是将逗号表达式转换为标量数组。有关如何使用逗号表达式的教程,请参阅以下链接中的讨论。

https://www.mathworks.com/matlabcentral/discussions/tips/847976-tutorial-comma-separated-lists-and-how-to-use-them

  • 转换为其他内置数据类型

这实际上将结构体数组转换为另一种数据表示形式,子字段(子级别,通常是

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
© www.soinside.com 2019 - 2024. All rights reserved.