![MATLAB/Simulink权威指南:开发环境、程序设计、系统仿真与案例实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/629/27111629/b_27111629.jpg)
2.7 结构数组和元胞数组
在MATLAB语言中,有两种复杂的数据类型,分别是结构数组(Structure Array)和元胞数组(Cell Array),这两种类型都能在一个数组里存放不同类型的数据。
2.7.1 结构数组
结构数组又称结构体,能将一组具有不同属性的数据放到统一变量名下进行管理。结构体的基本组成是结构,每个结构可以有多个字段,可以存放多种不同类型的数据。
1.结构数组的创建
结构数组的创建方法有两种:直接创建法和用struct函数创建。
(1)直接创建法可以直接使用赋值语句,对结构数组的元素赋值不同类型的数据。具体格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P94_28838.jpg?sign=1738889074-wr7PlwXItnUk6XiyOGwNWNpZ8vIE6PBb-0-b3de0c3df195fbb3593fe9d83fda65b8)
例如,构建一个班级学生信息结构数组dz1143,有三个元素dz1143(1)、dz1143(2)和dz1143(3),每个元素有四个字段Name、Sex、Nationality和Score,分别存放学生姓名、性别、国籍和成绩等信息。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P94_28839.jpg?sign=1738889074-MD15GZk1EijXM1BQBJeE949xB8T6hsU6-0-82fa39b0ce5e859656346605838e7739)
其中,dz1143是结构数组名,dz1143(1)、dz1143(2)和dz1143(3)分别是结构数组的元素,Name、Sex、Nationality和Score分别是字段。
(2)利用函数struct创建结构数组还可以使用struct函数。函数具体格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P95_28843.jpg?sign=1738889074-YJ5XwivKFVMixi34cp2VhzbA365bxISi-0-4da7532694b700256cc0e678542ff253)
例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P95_28844.jpg?sign=1738889074-DN18uSpC447QQGkYko5EyYzm0MtzQ0p6-0-6ce25a9fb09509fbb22eee701fa1d40d)
2.结构体内部数据的获取
(1)使用“.”符号获取结构体内部数据,对于上面例题中的dz1143结构体,用下面命令获得结构体的各个字段的内部数据:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P95_28845.jpg?sign=1738889074-voT4ZdtAYrW906vFqI3rxz2WOC6IO55I-0-61173a444b6c3bea97b939439d2b78e8)
(2)使用函数getfield获取结构体内部数据,getfield函数的格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P95_28846.jpg?sign=1738889074-e4oWCWxHAS28QNHSeRYWvTHrHfoXnY6F-0-5c55d4274e34c6a3f20d687970fa5750)
其中,S是结构体名称,S_index是结构体的元素,fieldname为结构体的字段,field_index是字段中数组元素的下标。
例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P96_28848.jpg?sign=1738889074-dOD2SaAJbhdM3NHpFFX5pXOA31pM3NAY-0-60dc47139044f7ac575e3b6131f4dce9)
(3)使用函数fieldnames获取结构体所有字段,fieldnames函数的格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P96_28849.jpg?sign=1738889074-kvFUlW1wumTQtlXeDQIgHBWpEJk58UYz-0-ca31203e3d176ce5de444c391a8a80ef)
例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P96_28850.jpg?sign=1738889074-7Uwynt0nvBh9rn9ogVyot7IIST64VDso-0-e17d6709bf7665e2f98f4a95ea4dc732)
3.结构体的操作函数
(1)可以使用setfield函数对结构体的数据进行修改,函数的格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P96_28851.jpg?sign=1738889074-zWzOfzFVqmzLDPcrYesI1czZHx27d2vY-0-9a49f61b27361a793af46ce2a58cfebe)
例如,修改结构体dz1143(1)中的Sex字段的内容:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P96_28852.jpg?sign=1738889074-fomGlLVSuuZemcnsI9lq9Xrpl73yL7em-0-855a43d4d2d1427f65e99b9948a73aaa)
(2)可以使用rmfield函数删除结构体的字段,函数格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P96_28853.jpg?sign=1738889074-2uh6ElwvO51h3yCxJeMd4wlPOpE109T3-0-cffeac5c626636769182510600db8125)
例如,删除结构体dz1143中的Nationality字段:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P97_28854.jpg?sign=1738889074-i0R5yoUp5zGy6kisvepG5awgQCE7w660-0-0468bba0e04f437d164a228b800b2cf0)
2.7.2 元胞数组
元胞数组是常规矩阵的扩展,其基本元素是元胞,每个元胞可以存放各种不同类型的数据,如数值矩阵、字符串、元胞数组和结构数组等。
1.元胞数组的创建
创建元胞数组的方法和一般数值矩阵方法相似,用大括号将所有元胞括起来。创建元胞数组的方法有两种:直接创建和使用函数创建。
(1)直接创建元胞数组可以一次性输入所有元胞值,也可以每次赋值一个元胞值。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P97_28855.jpg?sign=1738889074-F7IkCm3X1Qwf0XEyfgjNSAtHZ6rD08Pe-0-f915fa2bebb92d9cc52c723d64b8b4b2)
另外还可以根据各元胞内容创建元胞数组,例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P97_28856.jpg?sign=1738889074-qbZDLQnztf8ch0WFA5SHT6FUDlnzxbKM-0-8fddab9e56290bba3b32b60c026c889c)
由上面结果可知,用三种不同的直接输入法创建的元胞数组A、B和C结果是一样的。注意()和{}的区别,创建元胞数组无论用哪种方法,等式的左边或者右边一般都需要使用一次{},若元胞是由元胞数组构成,则需要用两次{}。
(2)MATLAB语言可以使用cell函数创建元胞数组。函数格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P98_28857.jpg?sign=1738889074-NwdfAR9JqgHWi151zkVwkRNhg8Gpo5Ee-0-0dfc29d7c5a358b6fb1940c0b133ad2d)
cell函数可以创建一个m×n空的元胞数组,对于每个元胞的数据还需要单独赋值。例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P98_28858.jpg?sign=1738889074-QniGgSJAfoooZdbz9h9tnDgRJ2L4rphY-0-b1a3e5e07806d3c8d0006a29419e6119)
2.元胞数组的操作
在MATLAB中,创建元胞数组后,可以通过下面几种方法,引用和提取元胞数组元素的数据。
(1)用{}提取元胞数组的元素数据。
例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P98_28859.jpg?sign=1738889074-Biu5PJBTs7mIrsB1HNqKCKhdDtb6z98f-0-4986c7806c6fc2b6eb9ed673d6e53957)
(2)用()只能定位元胞的位置,返回的仍然是元胞类型的数组,不能得到详细元胞元素数据,例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P98_28860.jpg?sign=1738889074-vDVRg7shzI56ZdlJvuXB6OcTXVK2IIjW-0-a919da72caebc1140fd0d5a96258a1e9)
(3)用deal函数提取多个元胞元素的数据。
例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P99_28861.jpg?sign=1738889074-uyRw93jG5RpQZBFPMYCyf03FbcMJZp85-0-b99d3b1d4af66824489b945df229038b)
(4)用celldisp函数显示元胞数组中的详细数据内容。
在MATLAB命令窗口中,输入元胞数组名称,只显示元胞数组的各元素的数据类型和尺寸,不直接显示各元素的详细内容。可以用celldisp函数显示元胞数组中各元素的详细数据内容。
例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P99_28862.jpg?sign=1738889074-ApvtgSAj6shh2sfWVA73SN2OzpahWjzX-0-47daf0e144d3fd9bf17157087242ddd1)
(5)用cellplot函数以图形方式显示元胞数组的结构。
在MATLAB中,可以用cellplot函数以图形方式显示元胞数组的结构。
例如,创建一个元胞数组,并用图形方式显示。
代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P100_28863.jpg?sign=1738889074-yUvyVLukNkwnXA7ggOXbVCtwUk0RNNvA-0-5683757465f9fdb494097369958e0de1)
用cellplot函数显示元胞数组A的结果如图2-2所示,其中用不同的颜色和形状表示元胞数组的各元素的内容。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P100_8514.jpg?sign=1738889074-ygna8mOMMyxMG6HMk4IuMs5OkwlfLqzp-0-b3821d2f5d72b0843c867c98534d6e5e)
图2-2 元胞数组显示图