结构数组是调用字段的MATLAB数组。结构数组的字段能包含任何类型的数据。如,其中一个字段可能包含一个表示名称的文本字符串,另一个字段可能包含一个表示类别的标量,第三个字段则为测量结果矩阵,等等。[大谦MATLAB,dqmatlab点com]
创建结构数组
有两种方式可以生成结构数组:一种是使用赋值语句,另一种是使用struct函数。下面分别予以介绍。
1.使用赋值语句
可以通过将数据赋给单独的字段来生成一个简单的11结构数组。
【例2-75】
创建一个student结构数组如下:
student.name = 'Lu dan';
student.ID = 02;
student.test = [79 75 73; 80 78 77.5; 80 85 85];
在命令行中输入:
student
结果显示:
student =
name: 'Lu dan'
ID: 2
test: [3x3 double]
student是一个包含3个字段的结构数组。要扩展该结构数组,可在结构名后面添加索引号。
student(2).name = 'Han xu';
student(2).ID= 10;
student(2).test = [68 70 68; 78 88 81; 92 90 93];
现在student结构数组的大小为[1,2]。
注意:一旦结构数组包含一个以上的元素,则在输入数组名时MATLAB就不显示单独的字段内容,而是显示一个结构包含的信息类别的综述列表。
12结构数组student的字段为:
student =
1x2 struct array with fields:
name
ID
test
还可以使用fieldnames函数获取这个信息。该函数返回一个包含字段名称的单元数组,在扩展结构时,MATLAB用空矩阵填充没有指定的字段,这样,数组中的所有结构具有相同的字段名。如,输入
student(3).name = 'Zhang ling'
将student数组大小扩展为[1,3]。现在,student(3).ID和student(3).test都包含空矩阵了。
注意:这里不要求数组中每个元素的字段大小相同。在student结构中,name字段可以有不同的长度,test字段可以是大小任意的数组,等等。
2.使用struct函数
可以用struct函数预分配一个结构数组。其基本形式为:
str_array = struct('field1',val1,'field2',val2, ...)
其中,变量为字段名和它们的对应值。
在结构数组中获取数据
使用结构数组索引,能获取结构数组中的任何字段值或字段元素。相似地,可以给任何字段或字段单元赋值。在结构数组名后面添加索引范围,可以获取子数组。
【例2-76】
用下面的命令行生成一个12的结构数组。
mystudents = student(1:2)
1x2 struct array with fields:
name
ID
test
mystudents数组中的第一个结构与student数组中的第一个结构相同。
mystudents(1)
ans =
name: 'Lu dan'
ID: 2
test: [3x3 double]
要获取一个特定结构的字段,可以在结构名后面加一个小数点,小数点后面再加字段名。即:
str = student(2).name
str =
Han xu
可以赋值,例如:
student(3).test(2,2) = 87;
可以为结构一次提取一个字段值。如下面的命令行创建了一个13的包含所有ID字段的矢量。
IDs = [student.ID]
IDs =
2 10
类似地,可以为前两个结构创建一个包含测试数据的单元数组。
tests = {student(1:2).test}
tests =
[3x3 double] [3x3 double]
结构数组的大小
使用size函数可以获取结构数组或任何结构字段的大小。给定一个结构数组名作为变量,size返回一个包含数组各维的大小组成的自量。给定array(n).field形式的变量,size函数返回一个包含字段内容大小的矢量。例如:对于 13 的结构数组student,size(student)返回矢量[1,3]。语句size(student(1,2),name)返回student的元素(1,2)的名称字符串的长度。
操作字段
可以通过给单一结构添加字段来给数组中的每个结构添加一个字段。
【例2-77】student数组添加一个gender字段。
使用赋值语句给结构添加如下字段。
student(2).gender = 'boy';
现在student(2).gender具有指定的值。数组中的每个其他结构也有gender字段,但这些字段在给它们赋值以前包含空矩阵。
可以用rmfield函数从结构数组中的每个结构中删除给定的字段。它的基本形式为struc2 = rmfield(array, 'field'),其中,array是一个结构数组,“field”是要删除的字段的名称。例如,要从student数组中删除name字段,则输入:
student = rmfield(student,'name');
可以像操作其他MATLAB函数一样操作字段和字段元素。使用索引获取要操作的元素。例如,计算student(2)中test数组的行均值:
mean((student(2).test));
有时候,可以使用多种方法对结构数组中的所有字段使用函数和运算符。求student数组中所有ID字段的和的方式是:
total = 0;
for k = 1:length(student)
total = total + student(k).ID;
end
可用下面的语句简化上面的操作:
total = sum([student.ID]);
这等于使用逗号间隔的列表:
total = sum([student(1).ID, student(2).ID...]);
结构嵌套
一个结构字段能包含另一个结构,甚至一个结构数组,一旦创建了结构,就可以使用struct函数或赋值语句在已经存在的结构字段中嵌套结构。
1.用struct函数创建嵌套结构
要创建嵌套的结构,可以嵌套调用struct函数。
【例2-78】创建下面的结构数组:
A = struct('data',[3 4 7; 8 0 1],'nest',...
struct('testnum','Test 1', 'xdata',[4 2 8],...
'ydata',[7 1 6]));
可以通过赋值语句生成嵌套的结构。这些语句给数组中添加第二元素。例如:
A(2).data = [9 3 2; 7 6 5];
A(2).nest.testnum = 'Test 2';
A(2).nest.xdata = [3 4 2];
A(2).nest.ydata = [5 0 9];
2.索引嵌套的结构
要索引嵌套的结构,用点(.)标记添加嵌套的字段名。索引表达式中的第一个文本字符串确认结构数组,后面的表达式获取包含其他结构的字段名。例如,前面创建的数组A就有三级嵌套。用A(1).nest获取A(1)中的嵌套结构。用A(2).nest.xdata获取A(2)嵌套结构的xdata字段,用A(1).nest.ydata(2)获取A(1)中ydata字段的第二个元素。