购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 数据类型

MATLAB中的数据类型主要包括数值类型、逻辑类型、字符串、函数句柄、结构体和单元数组类型。这 6 种基本的数据类型都是按照数组形式存储和操作的。另外,MATLAB中还有两种用于高级交叉编程的数据类型,分别是用户自定义的面向对象的用户类类型和Java类类型。

2.1.1 数值类型

数值类型的数据主要有整数、单精度浮点数和双精度浮点数 3 类,如表 2-1 所示。

表 2-1 数值类型数据的分类

MATLAB中数值类型的数据包括有符号和无符号整数、单精度浮点数和双精度浮点数。在未加说明与特殊定义时,MATLAB对所有数值按照双精度浮点数类型进行存储和操作。

在需要时,可以指定系统按照该多种整数型或单精度浮点型对指定的数字或数组进行存储、运算等操作。相对于双精度浮点数格式,整数型与单精度浮点型的优点在于节省变量占用的内存空间,当然首先要在满足精度要求的情况下。

○提示

MATLAB会自动进行记忆体的使用和回收,而不像C语言,必须由使用者一一指定。这些功能使得MATLAB易学易用,使用者可专心致力于撰写程序。

1.整数类型

MATLAB中提供了 8 种内置的整数类型,这 8 种类型的存储占用位数、能表示的数值范围和转换函数均不相同,如表 2-2 所示。

表 2-2 MATLAB中的整数类型

不同的整数类型所占用的位数不同,因此能够表示的数值范围也不同。在实际应用中,应根据实际需要合理选择合适的整数类型。

由于MATLAB中数值的默认存储类型是双精度浮点类型,因此将变量设置为整数类型时,需要使用相应的转换函数,将双精度浮点数转换为指定的整数类型。

在转换过程中,MATLAB默认将待转换数值转换为与之最为接近的整数值,若小数部分为 0.5,则转换后的结果为与该浮点数最接近的两个整数中绝对值较大的一个。

另外,这些转换函数也可以将其他数据类型转换为指定的数据类型。在不超出数值范围的情况下,任意两个整数类型之间也可以通过转换函数进行相互转换。同时,由于不同的整数类型能够表示的数值范围不同,因此当运算结果超出相应的整数类型能够表示的范围时,就会出现一处错误,运算结果被置为该整数类型能够表示的最大值或最小值。

MATLAB中还包含了几类不同运算法则的取整函数,也可以把浮点数转换成整数,这些取整函数及相应的转换方式如表 2-3 所示。

表2-3 MATLAB中的取整函数

2.浮点数类型

MATLAB中提供了单精度浮点数类型和双精度浮点数类型,其存储位宽、能够表示的数值范围、数值精度各方面均不相同,具体如表 2-4 所示。

表 2-4 MATLAB中的浮点数类型

由表 2-4 可知,单精度浮点类型的占用位数少,因此占用内存小,但能够表示的数值范围和数值的精度都比双精度浮点类型小。

由于MATLAB中的默认数值类型为双精度浮点类型,因此与创建整数类型数值一样,也可以通过转换函数来实现创建单精度浮点类型。

双精度浮点数参与运算时,返回值的类型依赖于参与运算的其他数据类型。参与运算的其他数据为逻辑形、字符型时,返回结果为双精度浮点型;参与运算的其他数据为整数型时,返回结果为相应的整数类型;参与运算的其他数据为单精度浮点型时,返回结果为相应的单精度浮点型。

○注意

在MATLAB中,单精度浮点类型不能与整数类型进行算术运算。

例 2-1,浮点数参与的运算。

在命令窗口输入:

a=uint32(120);b=single(22.809);c=73.226;

ab=a*b

输出结果如下:

??? Error using ==> times

Integers can only be combined with integers of the same class, or scalar doubles.

在命令窗口输入:

ac=a*c

输出结果如下:

ac = 8787

在命令窗口输入:

bc=b*c

输出结果如下:

bc =1.6702e+003

在命令窗口输入:

str='hello'

输出结果如下:

str =

hello

在命令窗口输入:

newstr=str-44.3

输出结果如下:

newstr =

59.7000 56.7000 63.7000 63.7000 66.7000

在命令窗口输入:

whos

输出结果如下:

由于浮点数只占用一定的存储位宽,其中只有有限位分别用来存储指数部分和小数部分。因此,浮点类型能够表示的实际数值是有限且离散的,任何两个最近相邻的浮点数之间都有微小间隙,而处在间隙中的数值都只能用这两个相邻的浮点数之中的一个来表示。MATLAB中提供了eps函数,可以获取一个数值和最接近该数值的浮点数之间的间隙。

例 2-2,浮点数的精度。

在命令窗口输入:

format long

eps(3)

输出结果如下:

ans =

4.440892098500626e-016

在命令窗口输入:

eps(single(3))

输出结果如下:

ans =

2.3841858e-007

3.复数

复数包括实部和虚部两部分。MATLAB中默认使用字符 i j 作为虚部标志。创建复数时,可以直接按照复数形式进行输入或者利用complex函数。MATLAB库函数中关于复数的相关函数如表 2-5 所示。

表 2-5 MATLAB中关于复数的相关函数

4.无穷量(Inf)和非数值量(NaN)

MATLAB中使用Inf和-Inf分别代表正无穷量和负无穷量,NaN表示非数值的值。正负无穷量的产生一般是由于运算溢出,产生了超出双精度浮点数数值范围的结果,非数值量则是由于 0/0 或Inf/Inf类型的非正常运算而产生的,这两个NaN彼此是不相等的。

除了异常运算结果外,MATLAB还提供了特定函数Inf函数和NaN函数来创建指定数值类型的无穷量和非数值量,生成结果默认为双精度浮点类型中还有一种特殊的指数类型的数据叫做非数,通常表示运算得到的数值结果超出了运算范围。非数的实部用NaN表示,虚部用InF表示。

例 2-3,无穷量及非数值量的产生和性质。

在命令窗口中输入:

a = 0 / 0, b = log( 0 ),c = inf - inf

输出结果如下:

Warning: Divide by zero.

a = NaN

Warning: Log of zero.

b = -Inf

c = NaN

2.1.2 逻辑类型

逻辑类型的数据是指布尔类型的数据及数据之间的逻辑关系。除了传统的数学运算之外,MATLAB还支持关系和逻辑运算。这些运算的目的是提供求解真/假命题的答案。

作为所有关系和逻辑表达式的输入,MATLAB把任何非零数值当做真,把零当做假。所有关系和逻辑表达式的输出:对于真,输出为 1;对于假,输出为零。

逻辑类型数据进行运算时需要使用到关系操作符和逻辑运算符。

MATLAB关系操作符包括所有常用的比较,如表 2-6 所示。

表 2-6 MATLAB中的关系操作符

MATLAB关系操作符能用来比较两个同样大小的数组,或用来比较一个数组和一个标量。在后一种情况,标量和数组中的每一个元素相比较,结果与数组大小一样。

例 2-4,判断两数组之间的元素是否相等。

在命令窗口输入:

A = 1 : 9, B = 10 - A

输出结果如下:

在命令窗口输入:

TrueorFalse = ( A == B ) %判断A与B中的元素是否相等

输出结果如下:

○提示

“=”和“= =”在MATLAB中的意义是不同的。“= =”是对等号两边的两个变量进行比较,当它们相等时返回 1,它们不相等时返回 0;而“=”则是被用来将运算的结果赋给一个变量。

逻辑运算符提供了一种组合或否定关系表达式。如表 2-7 所示。

表 2-7 MATLAB逻辑运算符

例 2-5,判断两数组之间的元素是否相等。

在命令窗口输入:

A = 1 : 9;

TrueorFalse = ( A > 2 ) & ( A < 6 ) %判断A中元素是否在 2 与 6 之间

输出结果如下:

除了上述关系与逻辑运算符之外,MATLAB还提供了大量其他关系与逻辑函数。

●xor( x , y )指令的功能为异或运算, x y 同为零(假)或非零(真)时返回 0,否则返回 1。

●any(x)指令的功能为判断是否为零向量或零矩阵(即向量或矩阵中的元素全部为零),如果是零向量或零矩阵,返回 1,否则返回 0。

除此之外,MATLAB还提供了大量的函数,在运算过程中用来测试特殊值或条件是否存在,并返回相应的表示结果的逻辑值,如表 2-8 所示。

表 2-8 测试函数

2.1.3 字符和字符串

在MATLAB里,文本当做特征字符串或简单地当做字符串。字符串能够显示在屏幕上,也可以用来构成一些命令,这些命令在其他的命令中用于求值或者被执行。

在MATLAB中可能会遇到对字符和字符串的操作。一个字符串是存储在一个行向量中的文本,这个行向量中的每一个元素代表一个字符。实际上,元素中存放的是字符的内部代码,即ASCII码。当在屏幕上显示字符变量的值时,显示出来的是文本,而不是ASCII数字。由于字符串是以向量的形式来存储的,因此可以通过它的下标对字符串中的任何一个元素进行访问。字符矩阵也可以通过下标索引进行访问,但是矩阵的每行字符数必须相同。

字符串一般是ASCII值的数值数组,它作为字符串表达式进行显示。

例 2-6,字符串属性示例。

在命令窗口输入:

String ='Every good boy does fun.';

size(String)

输出结果如下:

ans =

1 24

在命令窗口输入:

whos

输出结果如下:

一个字符串是由单引号括起来的简单文本。在字符串里的每个字符是数组里的一个元素,字符串的存储要求每个字符 8 字节,如同MATLAB的其他变量。因为ASCII字符只要求一字节,故这种存储要求是浪费的,7/8 所分配的存储空间无用。然而,对字符串保持同样的数据结构可以简化MATLAB的内部数据结构。所给出的字符串操作并不是MATLAB的基本特点,但这种表达是方便和可接受的。

为了了解下面字符串的ASCII表达,只需对字符串执行一些算术运算。最简单和计算上最有效的方法是取数组的绝对值。

例 2-7,字符串的ASCII表达。

在命令窗口输入:

String ='Every good boy does fun.';

U=abs (String)

输出结果如下:

在命令窗口输入:

U=U+0

输出结果如下:

上例中,加零到字符串并没有改变它的ASCII的表达。

因为字符串是数值数组,它们可以用MATLAB中所有可利用的数组操作工具进行操作。

例 2-8,字符串数组的索引示例。

在命令窗口输入:

String ='Every good boy does fun.';

U =String(7:10)

输出结果如下:

U =

good

在命令窗口输入:

U =String(10:-1:7)

输出结果如下:

U =

doog

上例中字符串像数组一样进行编址。这里元素 7 到 10 包含单词good。

字符串内的单引号是由两个连续的单引号来表示的。

例 2-9,字符串中的单引号。

在命令窗口输入:

String ='It''s not the manual!'

输出结果如下:

String =

It's not the manual!

字符串的连接可以直接将字符串数组连接来实现。

例 2-10,字符串的连接。

在命令窗口输入:

U ='Hello,';

V =' world!';

W = [U V];

输出结果如下:

W =

Hello, world!

2.1.4 函数句柄

在MATLAB平台中,对函数的调用方法分为直接调用法和间接法调用法。

●直接调用函数,被调用的函数也通常被称为子函数。但是子函数只能被与其M文件同名的主函数或在M文件中的其他函数所调用,同时在一个文件中只能有一个主函数。

●而使用函数句柄对函数进行调用则避免了上述问题。函数句柄实际上是提供了一种间接调用函数的方法。创建函数句柄需要使用到操作符@,对MATLAB库函数中提供的各种M文件中的函数和使用者自主编写的程序中的内部函数,也都可以创建函数句柄,从而可以通过函数句柄来实现对这些函数的间接调用。

创建函数句柄的一般句法格式为

Function_Handle = @Function_Filename;

其中:

●Function_Filename是函数所对应的M文件的名称或MATLAB内部函数的名称;

●@是句柄创建操作符。

●Function_Handle变量保存了这一函数句柄,并在后续的运算中作为数据流进行传_递。

例如F_Handle = @cos就创建了MATLAB内部函数cos函数的句柄,并将之保存在F_Handle变量中,后续的运算过程中就可以通过F_Handle(x)来实现cos(x)的功能。

通过函数句柄调用函数时,也需要制定函数的输入参数,例如可以通过F_Handle(arg1,arg2,...,argn ) 这样的调用格式来调用具有多个输入参数的函数,对于那些没有输入参数的函数,在使用句柄调用时,在句柄变量之后的圆括号中不填写变量名即可,即F_Handle()。

例 2-11,函数句柄的创建与调用。

在命令窗口输入:

F_Handle = @cos

输出结果如下:

F_Handle =

@cos

在命令窗口输入:

x = 0 : 0.25 * pi : 2 * pi;

F_Handle( x ) %通过函数句柄调用函数

输出结果如下:

ans =

1.0000 0.7071 0.0000 -0.7071 -1.0000 -0.7071 -0.00000.70711.0000

MATLAB库函数中提供大量关于处理函数句柄的操作函数,将函数句柄的功能与其他数据类型联系起来,扩展了函数句柄的应用。函数句柄的简单操作函数如表 2-9 所示。

表 2-9 函数句柄的操作函数

例 2-12,函数句柄的基本操作。

在命令窗口输入:

F_Handlea=@exp

输出结果如下:

F_Handlea =

@exp

在命令窗口输入:

F_Handleb=@log

输出结果如下:

F_Handleb =

@log

在命令窗口输入:

functions(F_Handlea )

输出结果如下:

ans =

function: 'exp'

type: 'simple'

file: ''

在命令窗口输入:

isa(F_Handlea, 'function_handle') %判断F_Handlea是否是函数句柄

输出结果如下:

ans = 1

在命令窗口输入:

isequal(F_Handlea, F_Handleb) %判断两句柄是否对应同一函数

输出结果如下:

ans = 0

2.1.5 结构体类型

MATLAB中的结构体与C语言中结构体类似,一个结构体可以通过字段存储多个不同类型的数据。因此,结构体相当于一个数据容器,把多个相关联的不同类型的数据封装在一个结构体对象中。

如图 2-1 所示,结构体Student中有 4 个字段,姓名字段Name中存储了一个字符串类型的数据;年级Grade字段中存储了一个浮点数值;科目Subject字段中存储了一个一维字符串数组;成绩Result字段中存储了一个一维数组。一个结构体中可以具有多个字段,每个字段又可以存储不同类型的数据,通过这种方式就把多个不同类型的数据组织在了一个结构体对象中。

图 2-1 结构体student的示意图

创建结构体对象的方法有两种,可以直接通过赋值语句给结构体的字段赋值,也可以使用结构体创建函数struct。两种方法的具体操作步骤如下。

(1)通过字段赋值创建结构体。在对结构体的字段进行赋值时,赋值表达式的变量名使用“结构体名称。字段名称”的形式书写,对同一个结构体可以进行多个字段的赋值。

例 2-13,通过赋值创建结构体。

在命令窗口输入:

Student.Name='Sam';

Student.Grade=6;

Student.Subj ect={'Chinese','Math','English'};

Student.Result={99,99,99};

Student

输出结果如下:

Student =

Name: 'Sam'

Grade: 6

Subj ect: {1×3 cell}

Result: {[99] [99] [99]}

在命令窗口输入:

whos

输出结果如下:

上例中,通过对 4 个字段赋值,创建了结构体对象Student;然后用whos函数分析出Student是一个 1×1 的结构体数组。

○注意

进行字段赋值操作时,没有明确赋值的字段,MATLAB默认赋值为空数组。通过圆括号索引进行字段赋值,还可以创建任意尺寸的结构体数组。需要注意的是,同一个结构体数组中的所有结构体对象具有相同的字段组合。

(2)利用struct函数创建结构体。

Struct函数的句法形式为

StrArray = struct('field1', var1, 'field2', var2,…,'fieldn', varn)

上述语句可以创建结构对象StrArray,并将其 n 个字段分别赋值为var1,var2,...,varn。

例 2-14,利用struct函数创建结构体。

在命令窗口输入:

Schedule(2)=struct('Day','Thursday','Time','15:00','Number',18)

输出结果如下:

Schedule =

1×2 struct array with fields:

Day

Time

Number

在命令窗口输入:

Schedule(1) %结构体第一个元素没有赋值,因此所有字段均为空数组

输出结果如下:

ans =

Day: []

Time: []

Number: []

在命令窗口输入:

ScheduleArray=repmat(struct('Day','Thursday','Time','15:00','Number',18),1,2 )

输出结果如下:

ScheduleArray =

1×2 struct array with fields:

Day

Time

Number

在命令窗口输入:

ScheduleArray(1) %1×2 的结构体数组的两个元素完全相同

输出结果如下:

ans =

Day: 'Thursday'

Time: '15:00'

Number: 18

在命令窗口输入:

ScheduleArray(2)

输出结果如下:

ans =

Day: 'Thursday'

Time: '15:00'

Number: 18

在命令窗口输入:

newArray=struct('Day',{'Thursday','Friday'},'Time',{'15:00','9:00'},'Number',{18,6})

输出结果如下:

newArray =

1×2 struct array with fields:

Day

Time

Number

在命令窗口输入:

newArray(1)

输出结果如下:

ans =

Day: 'Thursday'

Time: '15:00'

Number: 18

在命令窗口输入:

newArray(2)

输出结果如下:

ans =

Day: 'Friday'

Time: '9:00'

Number: 6

2.1.6 单元数组类型

在MATLAB内进行运算的所有数据类型,都是按照数组及矩阵的形式进行存储和运算的,而这二者在MATLAB中的基本运算性质不同,阵列强调元素对元素的运算,而矩阵则采用线性代数的运算方式。本节主要介绍数组类型,关于矩阵的详细运算语法,可参看第3章的详细说明。

数组的属性及数组之间的逻辑关系,是编写程序时非常重要的两个方面。在MATLAB平台上,数组的定义是广义的,数组的元素可以是任意的数据类型,例如可以是数值、字符串、指针等。

利用数组的构建方法可以直接对变量进行赋值,如下所示。

例 2-15,对变量赋值创建数组。

在命令窗口输入:

Array = [1 2 3 4 5 6]

输出结果如下:

Array =

1 2 3 4 5 6

在MATLAB中可以使用冒号“:”来代表一系列数值。有时也使用它来定义数组。其句法格式如下。

Array = i : k

创建从 i 开始、步长为 1、到 k 结束的数字序列,即 i i +1, i +2,…, k 。如果 i > k ,MATLAB则返回一个空矩阵。数字 i k 不必是整数,该序列的最后一个数小于或等于 k

Array = i : j : k

创建从 i 开始、步长为 j 、到 k 结束的数字序列,即 i i + j i + 2 j ,…, k 。对于 j = 0,则返回一个空矩阵。数字 i j k 不必是整数,该序列的最后一个数小于或等于 k

还有一些预定义函数也可以用来创建线性序列和逻辑序列。

Array = linspace(a, b,100)

在区间[ a , b ]上创建一个有 100 个元素的向量,这 100 个数把整个区间线性分隔。

Array = linspace(a,b,n,100)

在区间[ a , b ]上创建一个有 n 个元素的向量。这个命令和冒号表示形式相近,但是它直接定义了数据的个数。

例 2-16,创建等差数列。

在命令窗口输入:

Array_a=0:5,Array_b=linspace(0,5,6)

输出结果如下:

当数组的元素个数为 0 时,就称数组为空。空数组是特殊的数组,它不含有任何元素。空数组的作用主要用于逻辑运算、数组声明、数组的清空等。

例 2-17,创建空数组。

在命令窗口输入:

Array_Empty=[]

输出结果如下:

○提示

数据流都是以变量为载体的,变量的命名规则为①第一个字母必须是英文字母;②字母间不可留空格;③最多只能有 19 个字母,多余字母会被MATLAB自动忽略。

2.1.7 单元数组类型(cell)

1.概述

单元(cell)数组是一种无所不包的广义矩阵。组成单元数组的每一个元素称为一个单元。每一个单元可以包括一个任意数组,如数值数组、字符串数组、结构体数组或另外一个单元数组,因而每一个单元可以具有不同的尺寸和内存占用空间。

○注意

和一般的数值数组一样,单元数组的维数不受限制,可以是一维、二维或多维。

MATLAB中使用单元数组的目的在于,它可以把不同类型的数据归并到一个数组中。

○注意

单元数组的创建有两种方法:使用赋值语句创建单元数组或利用cell函数创建数组。

(1)使用赋值语句创建单元数组。与一般数组有所不同的是,单元数组使用花括号“{}”来创建,使用逗号“,”或空格来分隔每一个单元,使用分号“;”来分行。

例 2-18,创建单元数组。

在命令窗口输入:

C = {'x',[1;3;6];10,pi}

whos C

程序运行结果如下:

(2)cell函数创建空单元数组。

cell函数的调用格式如下所示:

cellName = cell(m,n)

该函数创建一个 m × n 的空单元数组,其每一个单元均为空矩阵。

例 2-19,创建空单元数组。

在命令窗口输入:

a = cell(2,2)

b = cell(1)

whos

程序运行结果如下:

同一般的数值数组一样,单元数组的内存空间也是动态分配的。因此,使用cell函数创建空单元数组的主要目的是为该单元数组预先分配连续的存储空间,节约内存占用,提高执行效率。

2.单元数组的寻访

在单元数组中,单元和单元中的内容是两个不同范畴的东西,因此,寻访单元和单元中的内容是两个不同的操作。MATLAB为上述两种操作设计了相对应的操作对象:单元外标识(cell indexing)和单元内编址(Content addressing)。

对于单元数组 C C m n )指的是单元数组中第 m 行第 n 列的单元,而 C { m n }指的是单元数组中第 m 行第 n 列的单元中的内容。

例 2-20,单元数组的寻访。

在命令窗口依次输入命令:

C = {3,[4 7;6 6;80 9],'string';sin(pi/8),3>10,'code'}

unitVal_1 = C(2,2)

class(unitVal_1)

unitVal_2 = C{2,2}

class(unitVal_2)

依次得到的结果如下:

3.单元数组的操作

单元数组的操作包括合并、删除单元数组中的指定单元、改变单元数组的形状等。

(1)单元数组的合并。

例 2-21,单元数组的合并。

在命令窗口依次输入以下命令

a{1,1}='cellclass';

a{1,2}=[1 2 2];

a{2,1}=['a','b','c'];

a{2,2}=[9 5 6];

a

b = {'Jan'}

c = {a b}

得到的结果如下:

(2)单元数组中指定单元的删除。

如果要删除单元数组中指定的某个单元,只需要将空矩阵赋给该单元,即

C{ m,n} = []

例2-22,有一单元数组 C ,删除其中的单元数组。

在命令窗口依次输入下列命令:

C = {ones(3),'Hello, World',zeros(5),[20,4,6]}

C{1,4} = []

得到的结果如下:

(3)使用reshape函数改变单元数组的形状。

reshape函数的调用格式为

trimC = reshape(C,M,N)

该函数将单元数组 C 改变成一个具有 M N 列的新单元数组。

例 2-23 ,将例 3-12 中的单元数组 C (1×4)改变成new C (4×1)。

在命令窗口输入:

newC = reshape(C,4,1)

得到的结果如下:

newC =

[3x3 double]

'Hello, World'

[5x5 double]

[]

2.1.8 map容器类型

1.map容器类型及map类概述

map容器是MATLAB R2012a版本新增加的数据类型。map本意是映射,就是可以将一个量映射到另一个量。比如将一个字符串映射为一个数值,那个字符串就是map的“键(key)”,那个值就是map的数据(value)。由此,可以将map容器理解为是一种快速查找数据结构的键。

对一个map元素进行寻访的索引称为“键”。一个“键”可以是以下任何一种数据类型:

●1×N字符串。

●单精度或双精度实数标量。

●有符号或无符号标量整数。

这些键和其对应的数据存储在map中。一个map的每一个条目都包括唯一的键和相对应的数据。map中存储的数据可以是任何类型,包括数值类型、字符或字符串类型、结构体类型、单元类型或是其他map。

一个map是MATLAB类的一个对象。map类的所有对象具有 3 种属性,如表 2-10 所示。用户不能直接对这些属性进行修改,但可以通过作用于map类的函数进行修改。

表 2-10 map类的属性

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

2.创建map对象

map是一个map类中的对象,由MATLAB中名为“容器”的一个包来定义,可以通过构造函数来创建,其创建方法如下。

mapObj = containers.Map({key1,key2,…},{val1,val2,…})

当键和值是字符串时,需要对上述语法稍作变更,即

mapObj = containers.Map({'key1','key2',…},{val1,val2,…})

例2-24,创建一个名为schedulemap的map对象来存储表 2-11 所示的课程表。

表 2-11 课程表

创建过程如下:

得到的结果如下:

此外,map对象的创建可以分为两个步骤:首先创建一个空map对象;然后使用keys和Value方法对其内容进行补充。空map对象的创建方法如下。

newMap = containers.Map()

得到的结果如下:

3.查看/读取map对象

(1)查看map对象。

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

例 2-25,查看例 2-24 中创建的map对象。

在命令窗口依次输入:

keys(schedulemap)

values(schedulemap)

得到的结果如下:

ans = 'Friday' 'Monday' 'Thursday' 'Tuesday' 'Wednesday'

ans = 'Biology' 'Maths' 'Geography' 'Chinese' 'History'

(2)读取map对象。

在创建好一个map对象后,用户可以对其进行数据的寻访。寻访指定键(keyName)所对应的值(valueName)使用的格式如下:

valueName = mapName(keyName)

当键名是一个字符串时,需使用单引号将键名括起来。

例 2-26,通过使用键名访问例 2-24 中创建的schedulemap中的内容。

输入内容如下:

course = schedulemap('Wednesday')

得到的结果如下:

course =History

如果需要对多个键进行访问,可以使用values函数,如

values(schedulemap,{'Monday','Thursday'})

得到的结果为:

ans = 'Maths' 'Geography'

○提示

在对多个键进行访问时,不能像在其他数据类型中那样使用冒号“:”,这将导致错误产生。例如输入

schedulemap('Monday':'Thursday')

结果弹出错误信息如下:

Warning: Colon operands must be real scalars.

Error using containers.Map/subsref

The specified key is not present in this container.

4.编辑map对象

(1)从map对象中删除keys/values对。

用户可以使用remove函数从map对象中删除keys/values对,该函数的调用格式为

remove('mapName', 'keyName')

式中:mapName和keyName分别为map对象名称及需要删除的键名。执行该命令后,MATLAB系统删除指定的键名及其相对应的值。

例 2-27,删除schedulemap中的“星期四”及其对应的科目。

在命令窗口依次输入:

remove(schedulemap,'Thursday')

keys(schedulemap)

values(schedulemap)

得到的结果如下:

(2)添加keys/values对象。

当用户向一个map对象中写入新元素的值时,需要提供键名,而且该键的类型必须和map中其他键一致。该操作的调用格式为

●existingMapObj(newKeyName)= newValue。

例 2-28,为schedulemap添加“星期六”及其对应的科目“public elective course”,在命令窗口依次输入:

schedulemap('Saturday') = 'public elective course'

keys(schedulemap)

values(schedulemap)

得到的结果如下:

(3)修改keys。

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

例 2-29,根据例 2-28 中的schedulemap结果,修改“星期六”及其对应的科目“公共选修课”为“星期天”及其对应的科目“MBA”。

在命令窗口依次输入:

remove(schedulemap,'Saturday');

schedulemap('Sunday') = 'MBA';

keys(schedulemap)

values(schedulemap)

程序运行结果如下:

(4)修改values。

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

例 2-30,修改“星期一”的科目为“英语”。

在命令窗口依次输入:

schedulemap('Monday')

schedulemap('Monday') = 'english';

keys(schedulemap)

values(schedulemap)

程序运行结果如下: HXboWDx6LNBdZUp54kwFXejBes9Cs0CQJLiI01u+tXV8EsjKDarqpTA2ofLqjFQu

点击中间区域
呼出菜单
上一章
目录
下一章
×