结构数组

结构数组是调用字段的MATLAB数组。结构数组的字段能包含任何类型的数据。如,其中一个字段可能包含一个表示名称的文本字符串,另一个字段可能包含一个表示类别的标量,第三个字段则为测量结果矩阵,等等。[大谦MATLAB,dqmatlab点com]

创建结构数组

有两种方式可以生成结构数组:一种是使用赋值语句,另一种是使用struct函数。下面分别予以介绍。

1.使用赋值语句

可以通过将数据赋给单独的字段来生成一个简单的11结构数组。

【例2-75】

创建一个student结构数组如下:

code.matlab
student.name = 'Lu dan';
student.ID = 02;
student.test = [79 75 73; 80 78 77.5; 80 85 85];

在命令行中输入:

code.matlab
student

结果显示:

code.matlab
student =
    name: 'Lu dan'
    ID: 2
    test: [3x3 double]

student是一个包含3个字段的结构数组。要扩展该结构数组,可在结构名后面添加索引号。

code.matlab
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的字段为:

code.matlab
student =
1x2 struct array with fields:
    name
    ID
    test

还可以使用fieldnames函数获取这个信息。该函数返回一个包含字段名称的单元数组,在扩展结构时,MATLAB用空矩阵填充没有指定的字段,这样,数组中的所有结构具有相同的字段名。如,输入

code.matlab
student(3).name = 'Zhang ling'

将student数组大小扩展为[1,3]。现在,student(3).ID和student(3).test都包含空矩阵了。

注意:这里不要求数组中每个元素的字段大小相同。在student结构中,name字段可以有不同的长度,test字段可以是大小任意的数组,等等。

2.使用struct函数

可以用struct函数预分配一个结构数组。其基本形式为:

code.matlab
str_array = struct('field1',val1,'field2',val2, ...)

其中,变量为字段名和它们的对应值。

在结构数组中获取数据

使用结构数组索引,能获取结构数组中的任何字段值或字段元素。相似地,可以给任何字段或字段单元赋值。在结构数组名后面添加索引范围,可以获取子数组。

【例2-76】

用下面的命令行生成一个12的结构数组。

code.matlab
mystudents = student(1:2)
1x2 struct array with fields:
    name
    ID
    test

mystudents数组中的第一个结构与student数组中的第一个结构相同。

code.matlab
mystudents(1)
ans =
    name: 'Lu dan'
      ID: 2
      test: [3x3 double]

要获取一个特定结构的字段,可以在结构名后面加一个小数点,小数点后面再加字段名。即:

code.matlab
str = student(2).name
str =
   Han xu

可以赋值,例如:

code.matlab
student(3).test(2,2) = 87;

可以为结构一次提取一个字段值。如下面的命令行创建了一个13的包含所有ID字段的矢量。

code.matlab
IDs = [student.ID]
IDs =
     2    10

类似地,可以为前两个结构创建一个包含测试数据的单元数组。

code.matlab
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字段。

使用赋值语句给结构添加如下字段。

code.matlab
student(2).gender = 'boy';

现在student(2).gender具有指定的值。数组中的每个其他结构也有gender字段,但这些字段在给它们赋值以前包含空矩阵。

可以用rmfield函数从结构数组中的每个结构中删除给定的字段。它的基本形式为struc2 = rmfield(array, 'field'),其中,array是一个结构数组,“field”是要删除的字段的名称。例如,要从student数组中删除name字段,则输入:

code.matlab
student = rmfield(student,'name');

可以像操作其他MATLAB函数一样操作字段和字段元素。使用索引获取要操作的元素。例如,计算student(2)中test数组的行均值:

code.matlab
mean((student(2).test));

有时候,可以使用多种方法对结构数组中的所有字段使用函数和运算符。求student数组中所有ID字段的和的方式是:

code.matlab
total = 0;
for k = 1:length(student)
      total = total + student(k).ID;
end

可用下面的语句简化上面的操作:

code.matlab
total = sum([student.ID]);

这等于使用逗号间隔的列表:

code.matlab
total = sum([student(1).ID, student(2).ID...]);

结构嵌套

一个结构字段能包含另一个结构,甚至一个结构数组,一旦创建了结构,就可以使用struct函数或赋值语句在已经存在的结构字段中嵌套结构。

1.用struct函数创建嵌套结构

要创建嵌套的结构,可以嵌套调用struct函数。

【例2-78】创建下面的结构数组:

code.matlab
A = struct('data',[3 4 7; 8 0 1],'nest',...
struct('testnum','Test 1', 'xdata',[4 2 8],...
'ydata',[7 1 6]));

可以通过赋值语句生成嵌套的结构。这些语句给数组中添加第二元素。例如:

code.matlab
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字段的第二个元素。