![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=1738872817-fKf0sYZpv0RXhNGw8dJ2W5RR9yJoAkAx-0-89c8fc28d742fbc20e53f99ac347f98a)
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=1738872817-igUtxn3Pc5F0nkjUMRs8lfOHmzOsB04R-0-7c1c833f950c151ac827f52e0b61ff29)
当键和值是字符串时,需要对上述语法稍做变更,即:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_56_3.jpg?sign=1738872817-NnOQe4O2EfaKpCpbJRHBgJpy43TVZk89-0-e7d91c02f27c19c7d2c85cd28135e876)
例2-24:创建一个名为schedulemap的map对象来存储如表2-11所示的课程表。
表2-11 课程表
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_56_4.jpg?sign=1738872817-SFrCScoMtPPyubpkgpXlq3i6HAp6TRFC-0-f45b186c412db9672328a503a672aff5)
创建过程如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_56_5.jpg?sign=1738872817-FWDYYUOkXrVRuv9qMp1CFgFwq03sgYbr-0-9d9538844ee44858b3fe3a6dd95f8e4f)
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_1.jpg?sign=1738872817-Ta5ZgkY6XenBWypxWoVeH4XRIMdeS6Ca-0-93251f3399bcd66b7ee1cb83c7d23fab)
得到的结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_2.jpg?sign=1738872817-cbdltSleQ0zliYQJcbvgtu59RwXdsq5w-0-d85d66a1aa2a5cbc8a1a2236bf1b3b2a)
此外,map对象的创建可以分为两个步骤:首先创建一个空map对象;然后使用keys()和values()方法对其内容进行补充。空map对象的创建方法如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_3.jpg?sign=1738872817-zTcG6rlQL3XmBANUkXfWcxVydAOVO73J-0-35131b38569d498f14324c5bba1e823c)
得到的结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_4.jpg?sign=1738872817-xcSkcGfkPEeBEQxu1MXkAuP4tt5DgLv6-0-d2ba70a8da41a2d9284852de607dc31d)
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=1738872817-5BD83His8MFx9DxHbIBV7QNGdbDIgp3C-0-ec4940ad7d70dd4f9c8dac8f68de575a)
得到的结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_6.jpg?sign=1738872817-hLmqMG4FTwuokdijHCKofEFTMhDdidmq-0-8eb4eef20cae49922668faf1de1a520e)
(2)读取map对象。
在创建好一个map对象后,用户可以对其进行数据的寻访。寻访指定键(keyName)所对应的值(valueName)使用的格式如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_7.jpg?sign=1738872817-OAsLf8MX6x9iJt0HIFtQbamFSNJFd4oT-0-4c56d859b5c0a9a9449f92e256f80f02)
当键名是一个字符串时,需要使用单引号将其引起来。
例2-26:通过使用键名访问例2-24中创建的schedulemap对象中的内容。
在命令行窗口中输入:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_57_8.jpg?sign=1738872817-XJhXdKe7mfWmsKNHLPXUttVEiXqELJK1-0-3b3b0f899e2cf4a0b3df6908e114eb75)
得到的结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_1.jpg?sign=1738872817-zXla7Dwabsc648D6lubUB5eHoaiyfDbf-0-7f1b9e6b867dc37b9ea32a9aa08737c9)
如果需要对多个键进行访问,则可以使用values函数。例如:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_2.jpg?sign=1738872817-JhxKAw1AJO4EpFvlaFH9JTjaKi9vCWhJ-0-5a9e2f43f3036af97632abeb01602a4a)
得到的结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_3.jpg?sign=1738872817-xFQD91PXehMUzz3pSbdU6YgL0i5INBa8-0-9df87b4e38f9ffe21a507d2615d217c6)
○ 提示
在对多个键进行访问时,不能像在其他数据类型中那样使用冒号“:”,因为这将导致错误的产生。例如,输入:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_4.jpg?sign=1738872817-rCWg8I3ZcnyUOnXR1Cxj3wCt8n5OZRLr-0-fe2a4e3ac765ad6ea30febb6e7db5e21)
弹出如下错误提示信息:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_5.jpg?sign=1738872817-6QLBQYiEEwx46N52TtkzAEXMkYHokjLB-0-990b7d25fa668c1cb6bee8b1a3a27c0e)
4.编辑map对象
(1)从map对象中删除key/value对。
用户可以使用remove函数从map对象中删除key/value对。该函数的调用格式为:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_6.jpg?sign=1738872817-MO4tPfAjsTsare2QOTWPGIz8DVwGQLCi-0-267577b2e5511ced1a29a1e2b8539ad4)
在上述代码中,mapName和keyName分别为map对象的名称及需要删除的键名。执行该命令后,MATLAB系统会删除指定的键名及其对应的值。
例2-27:删除schedulemap对象中的“Thursday”及其对应的科目。
在命令行窗口中依次输入:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_7.jpg?sign=1738872817-r20gDUrjJFbWbprC9PBoJZmiOrnpy9Kz-0-62119817505d11cfec7042f0624b4cac)
得到的结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_58_8.jpg?sign=1738872817-Q0R2ebWyy4Kff0mSSbWe0VtOnuVBeati-0-e4ee75727d009505cf84af9f66af0574)
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_59_1.jpg?sign=1738872817-NgXppyBDO9vpmriBf7eGcgXNdMbN3odk-0-e6d5316df5bc8fd807a07c8dd42caa4a)
(2)添加key/value对。
当用户向一个map对象中写入新元素的值时,需要提供键名,而且该键的类型必须和map中的其他键一致。该操作的调用格式为:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_59_2.jpg?sign=1738872817-AVvf85QtV1TtgBi7AhtYZSx09w4BB3hK-0-0b3f033cf2f7fa43c52c3b9dc93cc66a)
例2-28:为schedulemap对象添加“Saturday”及其对应的科目“Public elective course”。
在命令行窗口中依次输入:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_59_3.jpg?sign=1738872817-LY3uQcKdPzMYvlNA7jSubFl1y78moZrL-0-d3189d345db68cd41e79f5ff8bd1bb5b)
得到的结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_59_4.jpg?sign=1738872817-xluOl5P8WwDIM5gnByjrVVgKTYyTyhjL-0-33ed093c5914017fd0c1d5c4eae54ce3)
(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=1738872817-Aqp61plHAXEjivQsR1DCAFrO7ctnjszr-0-f412fabc6f8ee5e77e742f06879fb312)
程序运行结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_59_6.jpg?sign=1738872817-QL3HSTtkxlD359WEILDm7sSHudFTHnEA-0-3afd9551ad7f61aafce03057d43b55ed)
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_60_1.jpg?sign=1738872817-2PJEDnlPBJPaW6qmlqBnXTmccwNo7TqG-0-c936470cd4483b111b220f9ca31e8b71)
(4)修改value。
通过赋值操作覆盖原有的值,即可对map对象中的值进行修改。
例2-30:修改“Monday”的科目为“English”。
在命令行窗口中依次输入:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_60_2.jpg?sign=1738872817-LLVQsYq7mgV1OpK56KISaeXccOVZAHzH-0-86e1c00c1149fec805ec7d5b09b10949)
程序运行结果如下:
![](https://epubservercos.yuewen.com/57BE9F/26947316904586506/epubprivate/OEBPS/Images/44590_60_3.jpg?sign=1738872817-ZHB3hiKLxtGUF8O8OMMjcwL1xUIXYpPo-0-4c14219519a5692cddaacbf3c08c0c34)