MATLAB基础与应用教程(第2版)
上QQ阅读APP看书,第一时间看更新

2.6 结构体对象和单元对象

从MATLAB 5.0开始,MATLAB新增加了两种数据类型,即结构体数据类型和单元数据类型。这两种数据类型均是将不同类型的相关数据集成到一个单一变量中,使大量的相关数据的处理与引用变得简单、方便。

2.6.1 结构体对象

结构体类型把一组类型不同而逻辑上相关的数据组成一个有机的整体,其作用相当于数据库中的记录。例如,要存储和处理学生的基本信息(包括学号、姓名、出生年月、入学成绩等),就可采用结构体类型。

1.结构体变量

一个结构体变量由若干相关数据组成,存放各个数据的容器称为字段,对字段的访问采用圆点表示法,即“结构体变量.字段”。

建立一个结构体变量可以采用给结构体对象的字段赋值的办法。例如,要建立一个结构体变量stuinfo,存储某个学生的信息,包括顺序号、姓名、出生日期,命令如下:

>> stu.num=101;stu.name='Andy';stu.birth='1996年7月20日’

stu =

  包含以下字段的 struct:

   num: 101

   name: 'Andy'

   birth: '1996年7月20日’

以上建立的结构体变量stu含有3个字段。结构体变量的字段也可以是另一个结构体。例如:

>> stu.score.math=90;stu.score.chemistry=92;stu.score.physics=88

stu =

  包含以下字段的 struct:

     num: 101

    name: 'Andy'

   birth: '1996年7月20日’

   score: [1×1 struct]

执行上述命令,结构体变量stu增加第4个字段,这个字段score也是结构体。

2.结构体数组

一个结构体变量只能存储一个对象的信息,如果要存储若干个对象的信息,就可以使用结构体数组。在MATLAB中,通过调用struct函数建立结构体数组。struct函数的调用格式如下:

s = struct(field1, value1, field2, value2…, fieldN, valueN)

其中,field1, field2, …, fieldN为字段名,value1, value2, …, valueN为字段值。例如,存储3个学生的基本信息,可以使用以下命令:

>> f1='num';v1={2001,2002,2004};

>> f2='name';v2={'Angel','Burtt','Cindy'};

>> f3='birth';v3={"1996年7月20日","1996年11月22日","1996年3月21日"};

>> f4='score';v4={[88,90,95,88],[77,78,79,87],[86,85;91,90]};

>> students=struct(f1,v1,f2,v2,f3,v3,f4,v4)

students =

包含以下字段的 1×3 struct 数组:

num

name

birth

score

3.结构体对象的引用

对结构体对象的引用,可以引用其字段,也可以引用整个结构体对象。例如:

>> students(1).score %引用数组元素student(1)的字段score

ans =

  88  90  95  88

>> students(3) %引用数组元素student(3)

ans =

包含以下字段的struct:

     num: 2004

    name: 'Cindy'

   birth: "1996年3月21日"

   score: [2×2 double]

若要删除结构体的字段,则可以使用rmfield函数来完成。例如,要删除前面建立的结构体变量stu的字段num,命令如下:

>> stu=rmfield(stu,'num') %删除stu变量的字段num

stu =

包含以下字段的struct:

   name: 'Andy'

  birth: '1996年7月20日’

  score: [1×1 struct]

执行命令后,stu变量中只包含name、birth、score字段。

2.6.2 单元数组

单元数组也是把不同类型的数据组合成一个整体。与结构体数组不同的是,结构体数组的每一个元素由若干字段组成,不同元素的同一字段存储的是相同类型的数据。单元数组的每一个元素是一个整体,存储多种类型的数据。单元数组也称为元胞数组。

1.单元数组的建立

建立单元数组时,数据用大括号括起来。例如,要建立单元数组C,命令如下:

>> C={1,[1,2;3,4],3;'text',pi,{11;22;33}}

C =

  2×3 cell 数组

   {[ 1]}  {2×2 double}  {[  3]}

   {'text'}  {[ 3.1416]}  {3×1 cell}

单元数组的元素称为单元。

也可以先调用cell函数建立空单元数组,再给单元数组元素赋值来建立单元数组。例如,建立上述单元数组C,也可以使用以下命令:

>> C=cell(2,3);

>> C{1, 1}=1;C{1,2}=[1,2;3,4];C{1,3}=3;

>> C{2,1}='text';C{2,2}=pi;C{2,3}={11;22;33};

2.单元数组的引用

引用单元数组的特定单元,通常使用以下方式:

A{row, col}

其中,A为单元数组,row和col分别指定其行号和列号,例如:

>> C{1,2}

ans =

  1  2

  3  4

也可以采用圆括号下标的形式引用单元数组的单元,例如:

>> C(2,1)

ans =

  1×1 cell 数组

   {'text'}

用圆括号下标的形式给单元数组中的单元赋值,数据要用大括号括起来。例如:

>> C(1,2)={[77,88,99]}

C =

  2×3 cell 数组

   {[ 1]}  {1×3 double}  {[  3]}

   {'text'}  {[ 3.1416]}  {3×1 cell}

若要删除单元数组中的某个元素,则给该元素赋值为[ ]。例如,删除C的第1行第2列的元素,命令如下:

>> C{1,2}=[]

C =

  2×3 cell 数组

   {[ 1]}  {0×0 double}  {[  3]}

   {'text'}  {[ 3.1416]}  {3×1 cell}