matlab结构体的创建与元素访问
matlab结构体的创建与元素访问
觉得有用的话,欢迎一起讨论相互学习~
参考文献
https://ww2.mathworks.cn/help/matlab/structures.html?searchHighlight=结构体&s_tid=doc_srchtitle
https://ww2.mathworks.cn/help/matlab/matlab_prog/create-a-structure-array.html
https://ww2.mathworks.cn/help/matlab/matlab_prog/access-data-in-a-structure-array.html
https://ww2.mathworks.cn/help/matlab/matlab_prog/access-data-in-nested-structures.html
https://ww2.mathworks.cn/help/matlab/matlab_prog/access-multiple-elements-of-a-nonscalar-struct-array.html
概念
- 对于一个结构体而言,(1),(2),(3)...称为同一个结构体的不同元素,
.1,.2,.3...
称为一个结构体的属性 - 带有可以包含各种类型和大小的数据的命名字段的数组
- 结构体数组是使用名为字段的数据容器将相关数据组合在一起的数据类型。每个字段都可以包含任意类型的数据。使用 structName.fieldName 格式的圆点表示法来访问结构体中的数据。
函数
创建结构体数组
- 下面的示例说明了如何创建结构体数组。结构体是使用被称为字段的数据容器将相关数据组合在一起的一种数据类型。每个字段都可以包含任意类型或任意大小的数据。将患者记录存储在含有字段 name、billing 和 test 的标量结构体中
- 数组中的每条患者记录都是 struct 类的结构体。由结构体构成的数组通常称为结构体数组。与其他 MATLAB 数组类似,结构体数组可以具有任意维度。
- 结构体数组具有下列属性:
- 数组中的所有结构体都具有相同数目的字段。
- 所有结构体都具有相同的字段名称。
- 不同结构体中的同名字段可包含不同类型或大小的数据。
- 数组中新结构体的任何未指定字段均包含空数组。
patient(3).name = 'New Name';
patient(3)
ans = struct with fields:
name: 'New Name'
billing: []
test: []
访问结构体中的元素
- 结构体也分为标量结构体和结构体数组,结构体数组可以通过结构体数组的索引进行访问,而标量结构体可以通过结构体名称进行访问。
访问标量结构体
- 要访问字段的一部分内容,请添加适合字段中数据的大小和类型的索引
- 如果特定的字段包含 元胞数组 ,使用 花括号{} 访问数据
访问非标量结构体数组的属性
- 通过将文件 mandrill.mat 中的数据加载到数组 S 的 第二个元素 中来创建一个 非标量数组 。
S(2) = load('mandrill.mat')
- 一个结构体数组的每个元素都必须具有相同的字段。 clown.mat 和 mandrill.mat 都包含变量 X、map 和 caption。
S 是一个 1×2 的数组。
S =
1×2 struct array with fields:
X
map
caption
对于非标量结构体,访问特定字段的语法为 structName(indices).fieldName。 重新显示 clown 图像,并指定 clown 结构体的索引 (1):
image(S(1).X)
colormap(S(1).map)
添加索引以选择并重新显示字段内容的左上角:
upperLeft = S(1).X(1:50,1:80);
image(upperLeft)
注意
仅当引用结构体数组的 单个元素 时,才能为字段的部分内容建立索引。 MATLAB® 不支持诸如 S(1:2).X(1:50,1:80) 的语句,后者尝试为结构体的多个元素的字段建立索引。
访问嵌套结构体中的数据
- 此示例演示了如何为嵌套于另一个结构体中的结构体建立索引。访问特定字段中的数据的一般语法为
`structName(index).nestedStructName(index).fieldName(indices)`` - 当结构体为 标量 (1×1) 时,无需包括索引以引用单个元素。例如,创建一个标量结构体 s,其中字段 n 是一个嵌套的标量结构体,其中包含字段 a、b 和 c:
s.n.a = ones(3);
s.n.b = eye(4);
s.n.c = magic(5);
- 访问字段 b 的第三行:
third_row_b = s.n.b(3,:)
变量 third_row_b 包含 eye(4) 的第三行。
third_row_b =
0 0 1 0
- 扩展 s,以便 s 和 n 都为非标量 (1×2):
s(1).n(2).a = 2*ones(3);
s(1).n(2).b = 2*eye(4);
s(1).n(2).c = 2*magic(5);
s(2).n(1).a = '1a';
s(2).n(2).a = '2a';
s(2).n(1).b = '1b';
s(2).n(2).b = '2b';
s(2).n(1).c = '1c';
s(2).n(2).c = '2c';
结构体 s 现在包含下图中所示的数据。
- 访问 n(位于 s 的第一个元素中)的第二个元素的字段 b 中的数组部分内容:
part_two_eye = s(1).n(2).b(1:2,1:2)
这将返回 2*eye(4) 的左上角 2×2 的部分:
part_two_eye =
2 0
0 2
访问非标量结构体数组的元素
- 访问和处理一个非标量结构体数组的多个元素中的数据
- 创建一个1*3的结构体s,其中包含字段f:
s(1).f = 1;
s(2).f = 'two';
s(3).f = 3 * ones(3);
- 尽管数组中的 每个结构体必须具有相同的字段数和相同的字段名称,但字段的类型和大小可以不同 引用多个元素的同一字段
s(1:3).f
或者s.f
- matlab 以逗号分隔列表的形式返回元素中的数据
ans = 1 ans = two ans = 3 3 3 3 3 3 3 3 3
- 不能使用v=s.f语法将该列表分配给单个变量,因为各个字段包含的数据类型可能不同,但是可以 将列表项分配给相同数量的变量 或者 分配给元胞数组
[v1, v2, v3] = s.f; c = {s.f};
- 如果所有字段均包含相同类型的数据并且可以构成超矩形,则可以串联列表项。例如,创建一个包含字段 f(具有数值标量)的结构体 nums,然后串联字段中的数据:
nums(1).f = 1;
nums(2).f = 2;
nums(3).f = 3;
allNums = [nums.f]
该代码返回
allNums =
1 2 3
- 如果要使用相同运算处理数组的每个元素,请使用 arrayfun 函数。例如,统计数组 s 中每个结构体的字段 f 的元素数。
numElements = arrayfun(@(x) numel(x.f), s)
语法 @(x) 可以创建匿名函数。此代码对数组 s 的每个元素调用 numel 函数,例如 numel(s(1).f),并返回
numElements =
1 3 9