![MATLAB R2022a完全自学一本通](https://wfqqreader-1252317822.image.myqcloud.com/cover/854/47548854/b_47548854.jpg)
2.1.8 map容器类型
1.map容器类型及map类概述
map的本意是映射,就是将一个量映射为另一个量。例如,将一个字符串映射为一个数值,此时该字符串就是map的键(key),数值就是map的数据(value)。因此,可以将map容器理解为一种快速查找数据结构的键。
对一个map元素进行寻访的索引称为“键”。一个键可以是以下任何一种数据类型。
● 1×N的字符串。
● 单精度或双精度实数标量。
● 有符号或无符号标量整数。
这些键和其对应的数据存储在map中。map的每个条目都包括唯一的键和相对应的数据。map中存储的数据可以是任何类型的,包括数值类型、字符或字符串类型、结构体类型、元胞数组类型或其他map。
一个map是MATLAB类的一个对象。map类的所有对象都具有3种属性,如表2-10所示。用户不能直接对这些属性进行修改,但可以通过作用于map类的函数进行修改。
表2-10 map类的属性
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_56_1.jpg?sign=1739363019-IROytfFGCD2vUQbUJM6ENGRO9yfxQMuY-0-cc479aa64f6017cb262fa4941136b169)
map类的属性的查看方法为map名+小数点“.”+map的属性名。例如,为了查看mapW对象包括的数据类型,需要使用mapW.ValueType命令。
2.创建map对象
map是一个map类中的对象,由MATLAB中名为“容器”的一个包来定义,可以通过构造函数来创建,创建方法如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_56_2.jpg?sign=1739363019-68akGHk1UXLBljPpsRX7f3lRECy2MvWh-0-62437883b2ce452c9752ea3ecae79d8e)
当键和值是字符串时,需要对上述语法稍做变更,即:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_56_3.jpg?sign=1739363019-QaLVcykyYPRL3tWlst9J7Q101zIfpIHr-0-afd79358a718eae50a3832ef4932990c)
例2-24:创建一个名为schedulemap的map对象来存储如表2-11所示的课程表。
表2-11 课程表
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_56_4.jpg?sign=1739363019-g2GRWu826h5uxrVtMwUiMPIUwwL2xKIy-0-f2a69737f404b63186b78c5b356d4b39)
创建过程如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_56_5.jpg?sign=1739363019-spwqNXIm1EJAR2glfEZebPCWwOmM2Ext-0-6b80c9c4eeaaae2198b78f657caa10ed)
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_1.jpg?sign=1739363019-tpjUEzlt6VWWdBnGnff7L0H5hLnmJaEi-0-1682ec2eae290e050af97347293e4ab7)
得到的结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_2.jpg?sign=1739363019-3rXvsCGTCUaSp2Pi4s4LXvYLX6a48Cy1-0-4c54c9684986a373c4ff0713529ed285)
此外,map对象的创建可以分为两个步骤:首先创建一个空map对象;然后使用keys()和values()方法对其内容进行补充。空map对象的创建方法如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_3.jpg?sign=1739363019-Fd6pxfIX7Pc8nz5Nt9n031MSCYZ7JMIZ-0-3e8df55a35190d74730978040c548cd3)
得到的结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_4.jpg?sign=1739363019-FuVWOgJZeKBLJfktrRZOVHTHcHs4OIHU-0-d8eef227694c06a982b73d13f0611292)
3.查看/读取map对象
(1)查看map对象。
map对象中的每个条目都包括两部分:一个唯一的键及其对应的值。可以通过keys函数查看map对象中包含的所有键,通过values函数查看所有的值。
例2-25:查看例2-24中创建的map对象。
在命令行窗口中依次输入:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_5.jpg?sign=1739363019-IIY2kY7pMkJWlgHBvXhTYd5GedpGYskL-0-e8e0736fab09186faa308fac2045fd43)
得到的结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_6.jpg?sign=1739363019-00zjqkFVOUz8V8JVtkIeL6Ud04qe66vD-0-91128369660d5f656626bdffe7178d99)
(2)读取map对象。
在创建好一个map对象后,用户可以对其进行数据的寻访。寻访指定键(keyName)所对应的值(valueName)使用的格式如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_7.jpg?sign=1739363019-yWhsZC6DESAD3qfCV2EocALC90YBSGLv-0-76101b92d3d2c5915a1237a0ff3a1094)
当键名是一个字符串时,需要使用单引号将其引起来。
例2-26:通过使用键名访问例2-24中创建的schedulemap对象中的内容。
在命令行窗口中输入:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_8.jpg?sign=1739363019-nPlxngm15YCUtIr7Gpsg5wSN83vnEih5-0-8b00492ff5e56d6f9f0dbdfe3ac1dba8)
得到的结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_1.jpg?sign=1739363019-fdoFi0qagWk0YdkI7ARz5ZUVIRw25UsF-0-e1b6e816970f05715053e9d1c8de09db)
如果需要对多个键进行访问,则可以使用values函数。例如:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_2.jpg?sign=1739363019-OUr0JSZKgPo6gcAlvopNSqdEVEEXEpvZ-0-6b8e689471efb357b21406265587b6e2)
得到的结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_3.jpg?sign=1739363019-BeHx7ezYWSO9VR6s06Ebzq5DVnBEPu8P-0-016a6c321defb277c7683f577ab47fbc)
○ 提示
在对多个键进行访问时,不能像在其他数据类型中那样使用冒号“:”,因为这将导致错误的产生。例如,输入:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_4.jpg?sign=1739363019-EvmMojXus5zA5ViyuCGTuUFdAGxWs1Jc-0-49b38d341e9aee9d4604c6c3cfc6bf9c)
弹出如下错误提示信息:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_5.jpg?sign=1739363019-eK6PvmYPh9ano24IOBATAPYz5EUtpjMU-0-3d6b8b08685ccf2dbf674bbb2afa5be5)
4.编辑map对象
(1)从map对象中删除key/value对。
用户可以使用remove函数从map对象中删除key/value对。该函数的调用格式为:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_6.jpg?sign=1739363019-zVCOMoMWV2f56gbZ9ZmrxV42kKbwnBgR-0-942e36bcb9ea45038797323d5426a14f)
在上述代码中,mapName和keyName分别为map对象的名称及需要删除的键名。执行该命令后,MATLAB系统会删除指定的键名及其对应的值。
例2-27:删除schedulemap对象中的“Thursday”及其对应的科目。
在命令行窗口中依次输入:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_7.jpg?sign=1739363019-Erk2HN2lGXsDBXmUwVOrVFcPs4dbIG06-0-06991e436d1c2a1b4878c916e28256cb)
得到的结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_8.jpg?sign=1739363019-QLk9SElXO79Ju6l7wXnTXmzg2joyCkWc-0-7b3808bff0569b9c9e43df138ed1ba83)
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_59_1.jpg?sign=1739363019-e2Bbs5z2lQOdpa1XfK70ulmo4p2xtRgQ-0-39ba9bc5f8a67311d8b7313153e25770)
(2)添加key/value对。
当用户向一个map对象中写入新元素的值时,需要提供键名,而且该键的类型必须和map中的其他键一致。该操作的调用格式为:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_59_2.jpg?sign=1739363019-3c92nHtnW58BCavchSAZctbB2pP56SGC-0-e14d5958b566c955d2a47ff0fd9020c6)
例2-28:为schedulemap对象添加“Saturday”及其对应的科目“Public elective course”。
在命令行窗口中依次输入:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_59_3.jpg?sign=1739363019-NUEyFgXRHOgeDLnJAHl67tIwm6HBFYhM-0-9e20245f4f28e6a2816c89dbc6fdf6ec)
得到的结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_59_4.jpg?sign=1739363019-18ISJYydEDYWredosbB7WqPUOqXjEoVZ-0-944c7cd6d26c0a208150d9b56124484f)
(3)修改key。
如果需要在保持值不变的情况下对键名进行更改,则首先要删除键名及其对应的值,然后添加一个有正确键名的新条目。
例2-29:根据例2-28中的schedulemap对象的结果,修改“Saturday”及其对应的科目“Public elective course”为“Sunday”及其对应的科目“MBA”。
在命令行窗口中依次输入:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_59_5.jpg?sign=1739363019-XhKsfpQ9vXPzwfLyf36avrFcp7F7fjon-0-e939149bc8348a5ba1f411ddf1102904)
程序运行结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_59_6.jpg?sign=1739363019-MONx2dnMfiYXmnx8CnLJp2bUrcnXX0DE-0-11353f3ad47fb3ba29eaabd881aad4e2)
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_60_1.jpg?sign=1739363019-q0nGGHHGnCoQMlTogVIxQq3msY4tj7Xn-0-3922af2b5c7020bf5e14e0aa11c4dd2c)
(4)修改value。
通过赋值操作覆盖原有的值,即可对map对象中的值进行修改。
例2-30:修改“Monday”的科目为“English”。
在命令行窗口中依次输入:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_60_2.jpg?sign=1739363019-MQmwXEZDOjZ6ezeh70HJOAO4eu90r1zM-0-aedf5f4b9771af3eac198d9692891ee5)
程序运行结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_60_3.jpg?sign=1739363019-LbOwyFIoMZTXQjGvM8ROPV0rBc5bBSqR-0-dd75a89e96d81825a171991f7ee4e482)