目录
结构体数组中数据的组织方法
至少有两种方法可用来组织结构体数组中的数据:平面组织和按元素组织。最适合数据的方法取决于计划访问数据的方式,而对于大型数据集,取决于是否存在系统内存约束。
使用平面组织更易于访问字段中的所有值。使用按元素组织更易于访问与单个元素或记录相关的所有信息。以下部分包括每种组织类型的示例:
-
平面组织
-
按元素组织
当创建结构体数组时,MATLAB® 将有关每个元素和字段的信息存储于数组标头中。因此,具有多个元素和字段的结构体比包含相同数据的简单结构体需要更多的内存。
平面组织
以具有与颜色强度值对应的三个数组的 RGB 图像为例。如图所示:
如果工作区中存在数组 RED
、GREEN
和 BLUE
,则以下命令将创建一个使用平面组织、名为 img
的标量结构体:
img.red = RED;
img.green = GREEN;
img.blue = BLUE;
使用平面组织更易于提取整个图像平面以进行显示、筛选或其他处理。例如,将红色强度值乘以 0.9
:
adjustedRed = .9 * img.red;
如果有多幅图像,可以将它们添加到 img
结构体,一个元素 img(1),...,img(n)
包含一幅图像。对于将元素添加到结构体的示例,请看以下部分。
按元素组织
以包含运动员信息的一个数据库为例。每条记录包含一位运动员的姓名、测试结果和时间的数据。
以下语句在名为sportman
的结构体数组中创建一个元素:
sportman(1).name = 'John Doe';
sportman(1).times = 127.00;
sportman(1).test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205];
附加运动员对应于结构体中的新元素。例如,为第二位运动员添加一个元素:
sportman(2).name = 'Ann Lane';
sportman(2).times = 28.50;
sportman(2).test = [68, 70, 68; 118, 118, 119; 172, 170, 169];
按元素组织支持简单索引以访问特定患者的数据。例如,计算第一位运动员的测试结果的平均值,按行(维度 2
)而不是按列计算。
aveResultsDoe = mean(sportman(1).test,2)
该代码返回
aveResultsDoe =
75.6667
178.5000
212.0000
访问非标量结构体数组的元素
此示例演示了如何访问和处理一个非标量结构体数组的多个元素中的数据。创建一个 1×3 的结构体 s,其中包含字段 f:
s(1).f = 1;
s(2).f = 'two';
s(3).f = 3 * ones(3);
尽管数组中的每个结构体都必须具有相同的字段数和相同的字段名称,但字段的类型和大小可以不同。当引用多个元素的字段 f 时,例如
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