结构体数组
当您有要按名称组织的数据时,可以使用结构体来存储这些数据。结构体将数据存储在名为字段的容器中,然后您可以按指定的名称访问这些字段。使用圆点表示法创建、分配和访问结构体字段中的数据。如果存储在字段中的值是数组,则可以使用数组索引来访问数组的元素。当您将多个结构体存储为一个结构体数组时,可以使用数组索引和圆点表示法来访问单个结构体及其字段。
创建标量结构体
首先,创建一个名为 patient
的结构体,其中包含存储患者数据的字段。下图显示该结构体如何存储数据。像 patient
这样的结构体也称为标量结构体,因为该变量只存储一个结构体。
使用圆点表示法添加字段 name
、billing
和 test
,为每个字段分配数据。在此示例中,语法 patient.name
创建结构体及其第一个字段。接下来的命令添加更多字段。
patient.name = 'John Doe';
patient.billing = 127;
patient.test = [79 75 73; 180 178 177.5; 220 210 205]
patient = struct with fields:
name: 'John Doe'
billing: 127
test: [3x3 double]
访问字段中的值
创建字段后,可以继续使用圆点表示法来访问和更改它存储的值。
例如,更改 billing
字段的值。
patient.billing = 512.00
patient = struct with fields:
name: 'John Doe'
billing: 512
test: [3x3 double]
使用圆点表示法,您还可以访问任何字段的值。例如,生成 patient.test
中各值的条形图。添加一个具有 patient.name
中文本的标题。如果字段存储数组,则此语法返回整个数组。
bar(patient.test)
title("Test Results for " + patient.name)
要访问存储在字段中的数组的一部分,请添加适合该数组的大小和类型的索引。例如,创建 patient.test
的一个列中数据的条形图。
bar(patient.test(:,1))
对非标量结构体数组进行索引
结构体数组可以是非标量的。您可以创建任意大小的结构体数组,只要数组中的每个结构体都有相同的字段即可。
例如,向 patients
添加第二个结构体,其中包含第二个患者的有关数据。此外,将原始值 127
赋给第一个结构体的 billing
字段。由于该数组现在有两个结构体,您必须通过索引来访问第一个结构体,如 patient(1).billing = 127
所示。
patient(2).name = 'Ann Lane';
patient(2).billing = 28.50;
patient(2).test = [68 70 68; 118 118 119; 172 170 169];
patient(1).billing = 127
patient=1×2 struct array with fields:
name
billing
test
因此,patient
是 1×2 结构体数组,其内容如下图所示。
数组中的每条患者记录都是 struct
类的结构体。由结构体构成的数组有时称为结构体数组。但是,术语结构数组和结构体数组的含义相同。与其他 MATLAB® 数组类似,结构体数组可以具有任意维度。
结构体数组具有下列属性:
数组中的所有结构体都具有相同数目的字段。
所有结构体都具有相同的字段名称。
不同结构体中的同名字段可包含不同类型或大小的数据。
如果向数组中添加新结构体而未指定其所有字段,则未指定的字段包含空数组。
patient(3).name = 'New Name';
patient(3)
ans = struct with fields:
name: 'New Name'
billing: []
test: []
要对结构体数组进行索引,请使用数组索引。例如,patient(2)
返回第二个结构体。
patient(2)
ans = struct with fields:
name: 'Ann Lane'
billing: 28.5000
test: [3x3 double]
要访问字段,请使用数组索引和圆点表示法。例如,返回第二个患者的 billing
字段的值。
patient(2).billing
ans = 28.5000
您还可以对由字段存储的数组进行索引。创建一个条形图,它仅显示 patient(2).test
的前两列。
bar(patient(2).test(:,[1 2]))
注意
仅当引用结构体数组的单个元素时,才能为字段的部分内容建立索引。MATLAB® 不支持诸如 patient(1:2).test(1:2,2:3)
的语句,后者尝试为结构体数组的多个元素的字段建立索引。请改用 arrayfun
函数。
另请参阅
struct
| fieldnames
| isfield