MATLAB结构

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

创建结构数组

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

1.使用赋值语句

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

创建一个student结构数组。在命令行中输入:

code.matlab
>> student.name='Lu dan';
>> student.ID=02;
>> student.test=[79 75 73];
>> student
student=
    name: 'Lu dan'
    ID: 2
    test: [79 75 73]

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

code.matlab
>> student(2).name='Han xu';
>> student(2).ID= 10;
>> student(2).test=[92 90 93];

现在student结构数组的大小为[1,2]。

code.matlab
>> size(student)
ans =
     1     2

注意:一旦结构数组包含一个以上的元素,则在输入数组名时MATLAB就不显示单独的字段内容,而是显示一个结构包含的信息类别的综述列表。

12结构数组student的字段为:

code.matlab
>> student
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, ...)

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

下面用struct函数创建上例中的student结构数组。

code.matlab
>> student2=struct('name','Lu dan','ID',02,'test',[79 75 73])
student2=
    name: 'Lu dan'
    ID: 2
    test: [79 75 73]

在结构数组中获取数据

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

接着13.1.1小节的例子,从student结构数组中获取第1个结构的数据。

code.matlab
>> mystudents=student(1)
mystudents=
    name: 'Lu dan'
      ID: 2
    test: [79 75 73]

获取student结构数组中前两个结构的数据。

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

要获取某特定结构的字段,可以在该结构索引后面加一个小数点,小数点后面再加字段名,例如:

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

可以给字段赋值,例如:

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

可以从每个结构提取指定字段值并保存到一个数组。如下面的命令行创建了一个包含所有ID字段的数组。

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

操作字段

可以通过给某一结构添加字段来给数组中的每个结构添加一个字段。

在13.1.1 小节创建的student结构数组的基础上,给该结构数组添加一个gender字段。在命令窗口使用赋值语句给结构添加gender字段:

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

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

可以用rmfield函数从结构数组的每个结构中删除指定的字段。它的基本形式为

code.matlab
struc2=rmfield(array, 'field')

其中,array是一个结构数组,“field”是要删除的字段的名称。例如,要从student数组中删除name字段,则输入:

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

使用索引获取要操作的元素。例如,计算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...]);