
2.7 结构数组和元胞数组
在MATLAB语言中,有两种复杂的数据类型,分别是结构数组(Structure Array)和元胞数组(Cell Array),这两种类型都能在一个数组里存放不同类型的数据。
2.7.1 结构数组
结构数组又称结构体,能将一组具有不同属性的数据放到统一变量名下进行管理。结构体的基本组成是结构,每个结构可以有多个字段,可以存放多种不同类型的数据。
1.结构数组的创建
结构数组的创建方法有两种:直接创建法和用struct函数创建。
(1)直接创建法可以直接使用赋值语句,对结构数组的元素赋值不同类型的数据。具体格式如下:

例如,构建一个班级学生信息结构数组dz1143,有三个元素dz1143(1)、dz1143(2)和dz1143(3),每个元素有四个字段Name、Sex、Nationality和Score,分别存放学生姓名、性别、国籍和成绩等信息。
程序代码如下:

其中,dz1143是结构数组名,dz1143(1)、dz1143(2)和dz1143(3)分别是结构数组的元素,Name、Sex、Nationality和Score分别是字段。
(2)利用函数struct创建结构数组还可以使用struct函数。函数具体格式如下:

例如:

2.结构体内部数据的获取
(1)使用“.”符号获取结构体内部数据,对于上面例题中的dz1143结构体,用下面命令获得结构体的各个字段的内部数据:

(2)使用函数getfield获取结构体内部数据,getfield函数的格式如下:

其中,S是结构体名称,S_index是结构体的元素,fieldname为结构体的字段,field_index是字段中数组元素的下标。
例如:

(3)使用函数fieldnames获取结构体所有字段,fieldnames函数的格式如下:

例如:

3.结构体的操作函数
(1)可以使用setfield函数对结构体的数据进行修改,函数的格式如下:

例如,修改结构体dz1143(1)中的Sex字段的内容:

(2)可以使用rmfield函数删除结构体的字段,函数格式如下:

例如,删除结构体dz1143中的Nationality字段:

2.7.2 元胞数组
元胞数组是常规矩阵的扩展,其基本元素是元胞,每个元胞可以存放各种不同类型的数据,如数值矩阵、字符串、元胞数组和结构数组等。
1.元胞数组的创建
创建元胞数组的方法和一般数值矩阵方法相似,用大括号将所有元胞括起来。创建元胞数组的方法有两种:直接创建和使用函数创建。
(1)直接创建元胞数组可以一次性输入所有元胞值,也可以每次赋值一个元胞值。

另外还可以根据各元胞内容创建元胞数组,例如:

由上面结果可知,用三种不同的直接输入法创建的元胞数组A、B和C结果是一样的。注意()和{}的区别,创建元胞数组无论用哪种方法,等式的左边或者右边一般都需要使用一次{},若元胞是由元胞数组构成,则需要用两次{}。
(2)MATLAB语言可以使用cell函数创建元胞数组。函数格式如下:

cell函数可以创建一个m×n空的元胞数组,对于每个元胞的数据还需要单独赋值。例如:

2.元胞数组的操作
在MATLAB中,创建元胞数组后,可以通过下面几种方法,引用和提取元胞数组元素的数据。
(1)用{}提取元胞数组的元素数据。
例如:

(2)用()只能定位元胞的位置,返回的仍然是元胞类型的数组,不能得到详细元胞元素数据,例如:

(3)用deal函数提取多个元胞元素的数据。
例如:

(4)用celldisp函数显示元胞数组中的详细数据内容。
在MATLAB命令窗口中,输入元胞数组名称,只显示元胞数组的各元素的数据类型和尺寸,不直接显示各元素的详细内容。可以用celldisp函数显示元胞数组中各元素的详细数据内容。
例如:

(5)用cellplot函数以图形方式显示元胞数组的结构。
在MATLAB中,可以用cellplot函数以图形方式显示元胞数组的结构。
例如,创建一个元胞数组,并用图形方式显示。
代码如下:

用cellplot函数显示元胞数组A的结果如图2-2所示,其中用不同的颜色和形状表示元胞数组的各元素的内容。

图2-2 元胞数组显示图