首页 > 编程笔记 > MATLAB笔记 阅读:17

MATLAB map容器类的用法(非常详细)

在 MATLAB 中,map 的本意是映射,就是将一个量映射为另一个量。例如,将一个字符串映射为一个数值,此时该字符串就是 map 的键(key),数值就是 map 的数据(value)。因此,可以将 map 容器理解为一种快速查找数据结构的键。

对一个 map 元素进行寻访的索引称为“键”。一个键可以是以下任意一种数据类型:
这些键和其对应的数据存储在 map 中。map 的每个条目都包括唯一的键和相对应的数据。map 中存储的数据可以是任意类型的,包括数值型、字符型、结构体、元胞数组或其他 map。

一个 map 是 MATLAB 类的一个对象。map 类的所有对象都具有 3 种属性,如下表所示。

表:map类的属性
属性 说明 默认值
Count 无符号 64 位整数,表示 map 对象中存储的 key/value 对的总数 0
KeyType 字符串,表示 map 对象中包括的 key 的类型 char
ValueType 字符串,表示 map 对象中包括的数据类型 any

用户不能直接对这些属性进行修改,但可以通过作用于 map 类的函数进行修改。

map 类的属性的查看方法为 map 名+小数点“.”+map 的属性名。例如,为了查看 mapW 对象包括的数据类型,需要使用 mapW.ValueType 命令。

创建map对象

map 是一个 map 类中的对象,由 MATLAB 中名为“容器”的一个包来定义,可以通过构造函数来创建,创建方法如下:
mapObj = containers.Map({key1, key2, ...}, {val1, val2, ...})

当键和值是字符串时,需要对上述语法稍做变更:
mapObj = containers.Map({'key1', 'key2', ...}, {val1, val2, ...})

【实例 1】创建一个名为 schedulemap 的 map 对象来存储下图所示的课程表。


图 1 课程表

在命令行窗口中输入以下语句,并显示相应的输出结果:
>> clear
>> schedulemap = containers.Map({'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'}, {'Maths', 'Chinese', 'History', 'Geography', 'Biology'})
schedulemap =
  Map - 属性:
    Count: 5
    KeyType: char
    ValueType: char
此外,map 对象的创建可以分为两个步骤:首先创建一个空 map 对象;然后使用 keys 和 values 函数对其内容进行补充。

空 map 对象的创建方法如下。在命令行窗口中输入以下语句:
>> newMap = containers.Map()
newMap =
  Map - 属性:
    Count: 0
    KeyType: char
    ValueType: any

查看map对象

map 对象中的每个条目都包括两部分,一个唯一的键及其对应的值。可以通过 keys() 函数查看 map 对象中包含的所有键,通过 values() 函数查看所有的值。

【实例 2】查看实例 1 中创建的 map 对象。在命令行窗口中输入以下语句,并显示相应的输出结果。
>> keys(schedulemap)
ans =
  1x5 cell 数组
    {'Friday'}    {'Monday'}    {'Thursday'}    {'Tuesday'}    {'Wednesday'}

>> values(schedulemap)
ans =
  1x5 cell 数组
    {'Biology'}    {'Maths'}    {'Geography'}    {'Chinese'}    {'History'}

读取map对象

在创建好一个 map 对象后,用户可以对其进行数据的寻访。寻访指定键(keyName)所对应的值(valueName)使用的格式如下:
valueName = mapName(keyName)
当键名是一个字符串时,需要使用单引号将其引起来。

【实例 3】通过使用键名访问实例 1 中创建的 schedulemap 对象中的内容。在命令行窗口中输入以下语句,并显示相应的输出结果:
>> course = schedulemap('Wednesday')
course =
    'History'

如果要对多个键进行访问,则可以使用 values() 函数。如在命令行窗口中输入以下语句:
>> values(schedulemap, {'Monday', 'Thursday'})
ans =
  1x2 cell 数组
    {'Maths'}    {'Geography'}

提示,在对多个键进行访问时,不能像在其他数据类型中那样使用冒号“:”,因为这将导致错误的产生。例如,输入:
>> schedulemap('Monday':'Thursday')
弹出如下错误提示信息:

警告:Colon operands must be real scalars. This warning will become an error in a future release.

编辑map对象

1) 从map对象中删除key/value对

用户可以使用 remove() 函数从 map 对象中删除 key/value 对。该函数的调用格式如下:
remove('mapName', 'keyName')
在上述代码中,mapName 和 keyName 分别为 map 对象的名称及需要删除的键名。执行该命令后,MATLAB 系统会删除指定的键名及其对应的值。

【实例 4】删除 schedulemap 对象中的“Thursday”及其对应的科目。在命令行窗口中输入以下语句,并显示相应的输出结果。
>> week = {'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'};
>> subject = {'Maths', 'Chinese', 'History', 'Geography', 'Biology'};
>> schedulemap = containers.Map(week, subject)
schedulemap =
  Map - 属性:
    Count: 5
    KeyType: char
    ValueType: char

>> newMap = containers.Map()
newMap =
  Map - 属性:
    Count: 0
    KeyType: char
    ValueType: any

>> remove(schedulemap, 'Thursday')
>> keys(schedulemap)
ans =
  1x4 cell 数组
    {'Friday'}    {'Monday'}    {'Tuesday'}    {'Wednesday'}

>> values(schedulemap)
ans =
  1x4 cell 数组
    {'Biology'}    {'Maths'}    {'Chinese'}    {'History'}

2) 添加key/value对

当用户向一个 map 对象中写入新元素的值时,需要提供键名,而且该键的类型必须和 map 中的其他键一致。该操作的调用格式如下:
existingMapObj(newKeyName) = newValue
【实例 5】为 schedulemap 对象添加“Saturday”及其对应的科目“Public elective course”。在命令行窗口中输入以下语句,并显示相应的输出结果。
>> schedulemap('Saturday') = 'Public elective course'
schedulemap =
  Map - 属性:
    Count: 5
    KeyType: char
    ValueType: char

>> keys(schedulemap)
ans =
  1x5 cell 数组
    {'Friday'}    {'Monday'}    {'Saturday'}    {'Tuesday'}    {'Wednesday'}

>> values(schedulemap)
ans =
  1x5 cell 数组
    {'Biology'}    {'Maths'}    {'Public elective course'}    {'Chinese'}    {'History'}

3) 修改key

如果需要在保持值不变的情况下对键名进行更改,则首先要删除键名及其对应的值,然后添加一个有正确键名的新条目。

【实例 6】根据实例 5 中的 schedulemap 对象的结果,修改“Saturday”及其对应的科目“Public elective course”为“Sunday”及其对应的科目“MBA”。在命令行窗口中输入以下语句,并显示相应的输出结果。
>> remove(schedulemap, 'Saturday');
>> schedulemap('Sunday') = 'MBA';
>> keys(schedulemap)
ans =
  1x5 cell 数组
    {'Friday'}    {'Monday'}    {'Sunday'}    {'Tuesday'}    {'Wednesday'}

>> values(schedulemap)
ans =
  1x5 cell 数组
    {'Biology'}    {'Maths'}    {'MBA'}    {'Chinese'}    {'History'}

4) 修改value

通过赋值操作覆盖原有的值,即可对 map 对象中的值进行修改。

【实例 7】修改“Monday”对应的科目为“English”。在命令行窗口中输入以下语句,并显示相应的输出结果。
>> schedulemap('Monday')
ans =
    'Maths'

>> schedulemap('Monday') = 'English';
>> keys(schedulemap)
ans =
  1x5 cell 数组
    {'Friday'}    {'Monday'}    {'Sunday'}    {'Tuesday'}    {'Wednesday'}

>> values(schedulemap)
ans =
  1x5 cell 数组
    {'Biology'}    {'English'}    {'MBA'}    {'Chinese'}    {'History'}

相关文章