Matlab自学一本通
2021年7月8日
数据类型
Matlab中的数据类型主要包括:数值类型、逻辑类型、字符串、函数句柄、结构体和**单元数组类型。
这6种基本的数据类型都是按照数组形式存储和操作的。另外,Matlab中还有两种用于高级交叉编程的数据类型,分别是用户自定义的面向对象的的用户类型和Java类类型。
数值类型
基本的数值类型主要有整数、单精度浮点数、双精度浮点数。如下表所示:
数据格式 | 示例 | 说明 |
---|---|---|
int8、uint8、 int16、uint16、 int32、uint32、 int64、uint64 | int32(820) | 1.有符号和无符号的整数类型。 2.相同数值的整型类型占用比浮点类型更少的内存。 3.除int64和uint64类型外的所有整数类型,都可以进行数学运算。 |
single | single(128.1) | 1.单精度浮点类型。 2.相同数值的单精度浮点类型比双精度浮点类型占用更少内存。 3.精度与能够表示的数值范围比双精度浮点类型小 |
double | 333.77 1.000-1.000i | 双精度浮点类型,MATLAB中默认的数值类型 |
MATLAB中数值类型的数据包括有符号和无符号整型、单精度浮点数、双精度浮点数。
在未加说明与特殊定义时,MATLAB对所有数值按照双精度浮点数类型进行存储和操作。
在需要时,可以指定系统按照整数型或单精度浮点型对指定的数字或数组进行存储、运算等操作。相对于双精度浮点数格式,整数型与单精度浮点型的优点在于节省变量占用的内存空间,当然首先要在满足精度要求的前提下。
提示:MATLAB会自动进行记忆体的使用和回收,而不像C语言,必须由使用者一一指定。
整数类型
MATLAB中提供了8中内置的整数类型,这8种类型的存储占用位数、能表示的数值范围和转换函数均不相同。如下表所示:
整数类型 | 数值范围 | 转换函数 |
---|---|---|
有符号8位整数 | -27~27-1 | int8 |
无符号8位整数 | 0~2^8-1 | uint8 |
有符号16位整数 | -215~215-1 | int16 |
无符号16位整数 | 0~2^16-1 | uint16 |
有符号32位整数 | -231~231-1 | int32 |
无符号32位整数 | 0~2^32-1 | uint32 |
有符号64位整数 | -263~263-1 | int64 |
无符号64位整数 | 2^64-1 | uint64 |
不同的整数类型所占用的位数不同,因此能够表示的数值范围也不同。在实际应用中,应根据实际需要合理选择合适的整数类型。
由于MATLAB中数值的默认存储类型是双精度浮点类型,因此将变量设置为整数类型时,需要使用相应的转换函数,将双精度浮点数转换为指定的整数类型。
在转换过程中,MATLAB默认将待转换数值转换为与之最为接近的整数值。如果小数部分为0.5,则转换后的结果为与该浮点数最接近的两个整数中绝对值较大的一个。另外,这些转换函数也可以将其他数据类型转换为指定的数据类型。在不超过数值范围的情况下,任意两个整数类型之间也可以通过转换函数进行相互转换。同时,由于不同的整数类型能够表示的数值范围不同,因此当运算结果超出相应的整数类型能够表示的范围时,就会出现一处错误,运算结果被置为该整数类型能够表示的最大值或最小值。
MATLAB中还包含了几类不同运算法则的取整函数,也可以把浮点数转换为整数。这些取整函数及相应的转换方式如下表所示:
函数 | 运算法则 | 示例 |
---|---|---|
floor(x) | 向下取整 | floor(1.2)=1 floor(2.5)=2 floor(-2.5)=-3 |
ceil(x) | 向上取整 | ceil(1.2)=2 ceil(2.5)=3 ceil(-2.5)=-2 |
round(x) | 取最接近的整数 如果小数部分是0.5,取向绝对值大的方向取整 | round(1.2)=1 round(2.5)=3 round(-2.5)=-3 |
fix(x) | 向0取整 | fix(1.2)=1 fix(2.5)=2 fix(-2.5)=-2 |
浮点数类型
MATLAB中提供了单精度浮点数类型、双精度浮点数类型,其存储位宽、能够表示的数值范围、数值精度各方面均不相同,如下表所示:
浮点类型 | 存储位宽 | 各数位的意义 | 数值范围 | 转换函数 |
---|---|---|---|---|
单精度 | 32 | 0~22位表示小数部分 23~30位表示整数部分 31位表示符号(0正1负) | -3.40282e+038~-1.17549e-038 1.17549e-038~3.40282e+038 | single |
双精度 | 64 | 0~51位表示小数部分 52~62位表示指数部分 63位表示符号(0正1负) | -1.79769e+308~-2.22507e-308 2.22507e-308~1.79769e+308 | double |
单精度浮点类型的占用位数少,因此占用内存小,但是能够表示的数值范围和数值的精度都比双精度浮点类型小。
由于MATLAB中的默认数值类型为双精度浮点类型,因此与创建整型类型数据一样,也可以通过转换函数来实现创建单精度浮点类型。
双精度浮点数参与运算时,返回值的类型依赖于参与运算的其他数据类型。
参与运算的其他数据为:逻辑型、字符型时,返回结果为双精度浮点类型。
整数型时,返回结果为相应的整数类型。
单精度浮点类型时,返回结果为相应的单精度浮点型。
提示:在MATLAB中,单精度浮点类型不能与整数类型进行算术运算。
% 浮点数参与的运算:
a=uint32(120);b=single(22.809);c=73.226; str='hello';%根据MATLAB默认的类型是双精度浮点类型,所以C就是双精度浮点类型的参数
ab = a*b %当输入这个命令行的时候,就会报错
% 报错类型如下
% 错误使用 *
% 整数只能与相同类的整数或标量双精度值组合使用。
ac = a*c %结果就是uint32 8787
bc = b*c %结果就是single 1.6702118e+03
newstr=str-44.3 %结果就是 59.700000000000003 56.700000000000003 63.700000000000003 63.700000000000003 66.700000000000003
由于浮点数只占用一定的存储位数,其中只有有限位分别用来存储指数部分和小数部分。因此,浮点类型能够表示的实际数值是有限且离散的,任何两个最近相邻的浮点数之间都有微笑间隙,而处在间隙中的数值都只能有这两个相邻的浮点数之中的一个来表示。
MATLAB中提供了eps函数,可以获取一个数值和最接近该数值的浮点数之间的间隙。
% 浮点数的精度:
format long
eps(3)
% 结果如下
ans = 4.440892098500626e-16
eps(single(3))
ans = 2.3841858e-07
复数
复数包括实部和虚部两部分。MATLAB中默认使用字符i或j作为虚部标志。创建复数时,可以直接按照复数形式进行输入或者利用complex函数。MATLAB库函数中关于复数的相关函数表如下所示:
函数 | 说明 | 函数 | 说明 |
---|---|---|---|
real(z) | 返回复数z的实部 | imag(z) | 返回复数z的虚部 |
abs(z) | 返回复数z的模 | angle(z) | 返回复数z的幅角 |
conj(z) | 返回复数z的共轭复数 | complex(a,b) | 以a为实部、b为虚部创建复数 |
无穷量(Inf)和非数值量(NaN)
MATLAB中使用Inf和-Inf分别代表正无穷量和负无穷量,NaN表示非数值量。正负无穷量的产生一般是由于运算溢出,产生了超出双精度浮点数数值范围的结果,非数值量则是由于0/0或Inf/Inf类型的非正常运算而产生的,这两个NaN彼此是不相等的。
除了异常运算结果外,MATLAB还提供了特定函数Inf和NaN来创建指定数值类型的无穷量和非数值量,生成结果默认为双精度浮点类型中还有一种特殊的指数类型的数据叫作非数,通常表示运算得到的数值结果超出了运算范围。非数的实部用NaN表示,虚部用InF表示。
% 无穷量及非数值量的产生和性质
a = 0/0,b=log(0),c=inf-inf
% 输出结果为:
a = NaN
b = -Inf
c = NaN
逻辑类型
逻辑类型的数据是指布尔类型的数据及数据之间的逻辑关系。除了传统的数学运算,MATLAB还支持关系和逻辑运算。这些运算的目的是提供求解真/假命题的答案。
作为所有关系的逻辑表达式的输入,MATLAB把任何非零数值当作真,把零当作假。
所有关系和逻辑表达式的输出,对于真,输出为1;对于假,输出为0;
逻辑类型数据进行运算时需要用到关系操作符和逻辑运算符。
MATLAB关系操作符如下表所示:
关系操作符 | 说明 |
---|---|
< | 小于 |
<= | 小于或等于 |
> | 大于 |
>= | 大于或等于 |
== | 等于 |
~= | 不等于 |
MATLAB关系操作符能用来比较两个同样大小的数组,或用来比较一个数组和一个标量,在这种情况下,标量和数组中的每一个元素相比较,结果与数组大小一样。
% 判断两个数组之间的元素是否相等
A = 1:9 , B = 10 - A
% 输出结果为:
A = 1 2 3 4 5 6 7 8 9
B = 9 8 7 6 5 4 3 2 1
% 在判断是否相等
TrueorFalse = (A == B) %判断A与B中的元素是否相等
% 结果为:
TrueorFalse = 1×9 logical 数组
0 0 0 0 1 0 0 0 0
提示,”=“和""在MATLAB中的意义是不同的。”“是对等号两边的两个变量进行比较,当他们相等时返回1,不相等时返会0。而"="则是被用来运算的结果赋给一个变量。
逻辑运算符提供了一种组合或否定关系表达式,如下表所示:
逻辑运算符 | 说明 |
---|---|
& | 与 |
| | 或 |
~ | 非 |
% 判断两个数组之间的元素是否相等
A = 1:9;
TrueorFalse = (A>2)&(A<6) %判断A中元素是否在2~6之间
% 输出结果
TrueorFalse =
1×9 logical 数组
0 0 1 1 1 0 0 0 0
除了上述关系与逻辑运算符,MATLAB还提供了大量其他关系与逻辑函数。
xor(x,y)指令的功能为异或功能,x和y同为零(假)或非零(真)时返回0,否则返回1.
any(x)指令的功能是判断是否为零向量或零矩阵(即向量或矩阵中的元素全部为零),如果是零向量或零矩阵,则返回1,否则返回0.
除此之外,MATLAB还提供了大量的函数,在运算过程中用来测试特殊值或条件是否存在,并返回相应的表示结果的逻辑值,如下表所示:
函数名称 | 函数功能 |
---|---|
finite | 元素有限,返回真值 |
Isempty | 参量为空,返回真值 |
isglobal | 参量是一个全局变量,返回真值 |
ishold | 当前绘图保持状态是"ON",返回真值 |
isieee | 计算机执行IEEE算术运算,返回真值 |
isinf | 元素无穷大,返回真值 |
isletter | 元素为字母,返回真值 |
isnan | 元素为不定值,返回真值 |
isreal | 参量无虚部,返回真值 |
isspace | 元素为空格字符,返回真值 |
isstr | 参量是一个字符串,返回真值 |
isstudent | MATLAB为学生版,返回真值 |
isunix | 计算机为UNIX系统,返回真值 |
字符和字符串
在MATLAB中,文本当作特征字符串或简单地当作字符串。字符串能够显示在屏幕上,也可以用来构成一些命令,这些命令在其他的命令中用于求值或者被执行。
在MATLAB中,可能会遇到对字符和字符串的操作,一个字符串是存储一个行向量中的文本,这个行向量中的每一个元素代表一个字符。实际上,元素中存放的是字符的内部代码,即ASCII码。
当在屏幕上显示字符变量的值时,显示出来的是文本,而不是ASCII数字。由于字符串是以向量的形式来存储的,因此可以通过它的下表对字符串中的任何一个元素进行访问。字符矩阵也可以通过下标索引进行访问,但是矩阵的每行字符数必须相同。
字符串一般是ASCII值的数值数组,他作为字符串表达式进行显示。
% 字符串属性示例
string = 'Every good boy does fun.';
size(string)
% 答案是:
ans = 1 24
一个字符串是由单引号括起来的简单文本。在字符串里的每个字符是数组里的一个元素,字符串的存储要求每个字符8字节,如同MATLAB的其他变量。
因为ASCII字符只要求1字节,故这种存储要求是浪费的,7/8所分配的存储空间无用。然后,对字符串保持同样的数据结构可以简化MATLAB的内部数据结构。所给出的字符串操作并不是MATLAB的基本特点,故这种表达是方便和可接受的。
为了了解下面字符串的ASCII表达,只需对字符串执行一些算法运算。最简单和计算上最有效的方法是取数组的绝对值。
% 字符串的ASCII表打
string = 'Every good boy does fun.';
U = abs(string)
% 输出结果为:
U = 69 118 101 114 121 32 103 111 111 100 32 98 111 121 32 100 111 101 115 32 102 117 110 46
% 在输入
U = U+0
% 结果不变
上例中,加零到字符串并没有改变它的 ASCII 表达。因为字符串是数值数组,所以它们可以用 MATLAB 中所有可利用的数组操作工具进行操作。
% 字符串数组的索引示例
String ='Every good boy does fun.';
U =String(7:10)
% 输出结果
U = 'good'
% 在命令行窗口中输入:
U =String(10:-1:7)
% 输出结果
U = 'doog'
上例中字符串像数组一样进行编址。这里元素 7~10 包含单词 good。
% 字符串内的单引号是由两个连续的单引号来表示的。
% 字符串中的单引号。
% 在命令行窗口中输入:
String ='It''s not the manual!'
输出结果:
String =
It's not the manual!
% 字符串的连接可以直接将字符串数组连接来实现。
%字符串的连接。
%在命令行窗口中输入:
U ='Hello,';
V =' world!';
W = [U V]
输出结果:
W = Hello, world!
2021年7月9日
函数句柄
在 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()。
% 函数句柄的创建与调用。
% 在命令行窗口中输入:
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.0000 0.7071 1.0000
MATLAB库函数中提供了大量关于处理函数句柄的操作函数,将函数句柄的功能与其他数据类型联系起来,扩展了函数句柄的应用,函数句柄的简单操作函数如下表所示:
函数名称 | 函数功能 |
---|---|
functions(funhandle) | 返回一个结构体,存储了函数的名称、函数类型(simple或overloaded),以及函数M文件的位置 |
func2str(funhandle) | 将函数句柄转化为函数名称字符串 |
str2func(str) | 将字符串代表的函数转换为函数句柄 |
save filename.mat funhandle | 将函数句柄保存在*。mat文件中 |
load filename.mat funhandle | 把*.mat文件中存储的函数句柄加载到工作区 |
isa(var,‘function_handle’) | 检测变量var是否是函数句柄 |
isequal(funhandlea,funhandleb) | 检测两个函数句柄是否对应于同一个函数 |
% 函数句柄的基本操作。
% 在命令行窗口中输入:
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
结构体类型
MATLAB中的结构体与C语言中的结构体类似,一个结构体可以通过字符存储多个不同类型的变量。因此,结构体相当于一个数据容器,把多个相关联的不同类型的数据封装在一个结构体对象中。
如下图所示:结构图student中有4个字段,姓名字段name中存储了一个字符串类型的数据;年纪字段grade中存储了一个浮点数值;科目字段subject中存储了一个一维字符串数组;成绩字段result中存储了一个一维数组。
一个结构体中可以具有多个字段,每个字段又可以存储不同类型的数据,通过这种方式就把多个不同类型的数据组织在一个结构体对象中。
创建结构体对象的方法有两种:可以直接通过赋值语句给结构体的字段赋值,也可以使用结构体创建函数struct。
% 两种方法的具体操作步骤如下:
% (1)通过字段赋值创建结构体。在对结构体的字段进行赋值时,赋值表达式的变量名使用"结构体名称.字段名称"的形式书写,对同一个结构体可以进行多个字段的。赋值。
% 通过赋值创建结构体:
student.Name = 'Sam';
student.Grade = 6;
student.Subject = {'Chinese','Math','English'};
student.Result = {99,99,99};
student % 如果最后不加入这个student,工作台不会显示数据,这相当于调用函数出来显示
% 输出结果:
student =
包含以下字段的 struct:
Name: 'Sam'
Grade: 6
Subject: {'Chinese' 'Math' 'English'}
Result: {[99] [99] [99]}
% 再输入whos
% 输出结果为:
Name Size Bytes Class Attributes
student 1x1 1450 struct
上例中,通过对 4 个字段赋值,创建了结构体对象 Student,然后用 whos 函数分析出 Student 是一个 1×1 的结构体数组。
在进行字段赋值操作时,没有明确赋值的字段,MATLAB 默认赋值为空数组。通过圆括号索引进行字段赋值,还可以创建任意尺寸的结构体数组。需要注意的是,同一个结构体数组中的所有结构体对象具有相同的字段组合。
struct函数的句法形式为:
StrArray = struct('field1',var1,'field2',var2,...,'fieldn',varn);
上述语句可以创建结构对象 StrArray,并将其 n 个字段分别赋值为 var1,var2,…, varn。
% 利用 struct 函数创建结构体。
% 在命令行窗口中输入:
Schedule(2)=struct('Day','Thursday','Time','15:00','Number',18)
% 输出结果
Schedule =
包含以下字段的 1×2 struct 数组:
Day
Time
Number
% 在命令行窗口中输入:
Schedule(1) %结构体第一个元素没有赋值,因此所有字段均为空数组
ans =
包含以下字段的 struct:
Day: []
Time: []
Number: []
% 在命令行窗口中输入:
ScheduleArray=repmat(struct('Day','Thursday','Time','15:00','Number',18),1,2) % Repeat copies of array
ScheduleArray =
包含以下字段的 1×2 struct 数组:
Day
Time
Number
% 1×2的结构体数组的两个元素完全相同
newArray=struct('Day',{'Thursday','Friday'},'Time',{'15:00','9:00'}, 'Number',{18,6})
% 结果为:
newArray =
包含以下字段的 1×2 struct 数组:
Day
Time
Number
>> newArray(1)
ans =
包含以下字段的 struct:
Day: 'Thursday'
Time: '15:00'
Number: 18
>> newArray(2)
ans =
包含以下字段的 struct:
Day: 'Friday'
Time: '9:00'
Number: 6
数组类型
在 MATLAB 中进行运算的所有数据类型,都是按照数组及矩阵的形式进行存储和运算的,而二者在 MATLAB 中的基本运算性质不同,阵列强调元素对元素的运算,而矩阵则采 用线性代数的运算方式。本节主要介绍数组类型,关于矩阵的详细运算语法,可参看第 3 章 的详细说明。
数组的属性及数组之间的逻辑关系,是编写程序时非常重要的两个方面。在 MATLAB 平台上,数组的定义是广义的,数组的元素可以是任意的数据类型,例如可以是数值、字符 串、指针等。
% 利用数组的构建方法可以直接对变量进行赋值。
% 对变量赋值创建数组。
% 在命令行窗口中输入:
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+2j,…,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 个元素的向量。这个命令和冒号表示形式相近,但是它直接 定义了数据的个数。
% 创建等差数列。
% 在命令行窗口中输入:
Array_a=0:5,Array_b=linspace(0,5,6)
% 输出结果:
Array_a =
0 1 2 3 4 5
Array_b =
0 1 2 3 4 5
数组的元素个数为 0 时,就称数组为空。空数组是特殊的数组,它不含有任何元素。 空数组主要用于逻辑运算、数组声明、数组的清空等。
% 创建空数组。
% 在命令行窗口中输入:
Array_Empty=[]
% 输出结果:
Array_Empty = []
单元数组类型
1.概述
单元(Cell)数组是一种无所不包的广义矩阵。组成单元数组的每一个元素称为一个单元。
每一个单元可以包括一个任意数组,如数值数组、字符串数组、结构体数组或另外一个 单元数组,因而每一个单元可以具有不同的尺寸和内存占用空间。
和一般的数值数组一样,单元数组的维数不受限制,可以是一维、二维或多维。
MATLAB 中使用单元数组的目的在于,它可以把不同类型的数据归并到一个数组中。
单元数组的创建有两种方法:使用赋值语句创建单元数组和利用 cell 函数创建数组。
% 方法1:使用赋值语句创建单元数组。
% 与一般数组有所不同的是,单元数组使用花括号“{}”来创建,使用逗号“,”或空格来分隔每一个单元,使用分号“;”来分行。
% 创建单元数组。
% 在命令行窗口中输入:
C = {'x',[1;3;6];10,pi}
whos C
% 程序运行结果如下:
C =
'x' [3x1 double]
[10] [ 3.1416]
Name Size Bytes Class Attributes
C 2x2 282 cell
% 方法2:利用 cell 函数创建空单元数组。
% cell 函数的调用格式如下:
cellName = cell(m,n)
% 该函数创建一个 m×n 的空单元数组,其每一个单元均为空矩阵。
% 创建空单元数组。
% 在命令行窗口中输入:
a = cell(2,2)
b = cell(1)
whos
程序运行结果如下:
a =
[] []
[] []
b =
{[]}
Name Size Bytes Class Attributes
a 2x2 16 cell
b 1x1 4 cell
同一般的数值数组一样,单元数组的内存空间也是动态分配的。因此,使用 cell 函数创建空单元数组的主要目的是为该单元数组预先分配连续的存储空间,以节约内存占用,提高 执行效率。
2.单元数组的寻访
在单元数组中,单元和单元中的内容是两个不同范畴的东西,因此,寻访单元和单元中的内容是两个不同的操作。MATLAB 为上述两种操作设计了相对应的操作对象:单元外标识(Cell Indexing)和单元内编址(Content Addressing)。
对于单元数组 C,C(m,n)指的是单元数组中第 m 行第 n 列的单元,而 C{m,n}指的是单元数组中第 m 行第 n 列单元中的内容。
% 单元数组的寻访。
% 在命令行窗口依次输入命令:
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)
% 依次得到的结果如下:
C =
[ 3] [3x2 double] 'string'
[0.382683432365090] [ 0] 'code'
unitVal_1 = [0]
ans = cell
unitVal_2 = 0
ans = logical
3.单元数组的操作
单元数组的操作包括合并、删除单元数组中的指定单元、改变单元数组的形状等。
(1)单元数组的合并
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}
% 得到的结果如下:
a =
'cellclass' [1x3 double]
'abc' [1x3 double]
b = 'Jan'
c = {2x2 cell} {1x1 cell}
(2)单元数组中指定单元的删除。 如果要删除单元数组中指定的某个单元,只需要将空矩阵赋给该单元,即: C{ m,n} = []
% 有一个单元数组 C,删除其中的单元数组。
% 在命令行窗口依次输入下列命令:
C = {ones(3),'Hello, World',zeros(5),[20,4,6]}
C{1,4} = []
得到的结果如下:
C = [3x3 double] 'Hello, World' [5x5 double] [1x3 double]
C = [3x3 double] 'Hello, World' [5x5 double] []
(3)使用 reshape 函数改变单元数组的形状。
reshape 函数的调用格式为:
trimC = reshape(C, M, N)
该函数将单元数组 C 改变成一个具有 M 行 N 列的新单元数组。
% 单元数组 C(1×4)改变成 newC(4×1)。
% 在命令行窗口中输入:
newC = reshape(C,4,1)
% 得到的结果如下:
newC =
[3x3 double]
'Hello, World'
[5x5 double]
[]
map容器类型
**1.map 容器类型及 map 类概述 **
map 的本意是映射,就是可以将一个量映射到另一个量。
比如将一个字符串映射为一个数值,那个字符串就是 map 的键(key),那个值就是 map 的数据(value)。因此,可以将 map 容器理解为一种快速查找数据结构的键。 对一个 map 元素进行寻访的索引称为“键”。一个“键”可以是以下任何一种数据类型:
1×N 字符串。
单精度或双精度实数标量。
有符号或无符号标量整数。
这些键和其对应的数据存储在 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的属性名。例如,为了查看mapW对象包括的数据类型,需要使用mapW.ValueType。
2.创建 map 对象
map 是一个 map 类中的对象,由 MATLAB 中名为“容器”的一个包来定义,可以通过构造函数来创建,其创建方法如下:
mapObj = containers.Map({key1,key2,…},{val1,val2,…})
当键和值是字符串时,需要对上述语法稍作变更,即:
mapObj = containers.Map({'key1','key2',…},{val1,val2,…})
创建一个名为 schedulemap 的 map 对象来存储如表所示的课程表。
星期一 | 星期二 | 星期三 | 星期四 | 星期五 |
---|---|---|---|---|
数学 | 语文 | 历史 | 地理 | 生物 |
创建过程如下:
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
3.查看/读取 map 对象
(1)查看 map 对象。
map 对象中的每个条目包括两个部分:一个唯一的键及其对应的值。可以通过使用 keys 函数查看 map 对象中包含的所有键;通过 values 函数查看所有的值。
% 查看创建的 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)
当键名是一个字符串时,需使用单引号将键名括起来。
% 通过使用键名访问创建的 schedulemap 对象中的内容。
% 输入内容如下:
course = schedulemap('Wednesday')
% 得到的结果如下:
course =History
% 如果需要对多个键进行访问,可以使用 values 函数,如:
values(schedulemap,{'Monday','Thursday'})
% 得到的结果如下:
ans = 'Maths' 'Geography'
在对多个键进行访问时,不能像在其他数据类型中那样使用冒号“:”,这将导致错误产生。例如输入:
schedulemap('Monday':'Thursday')
结果弹出如下错误信息:
警告: 冒号操作数必须为实数标量。
4.编辑 map 对象
(1)从 map 对象中删除 keys/values 对。
用户可以使用 remove 函数从 map 对象中删除 keys/values 对,该函数的调用格式为:
remove('mapName', 'keyName')
式中,mapName 和 keyName 分别为 map 对象名称及需要删除的键名。执行该命令后,MATLAB 系统删除指定的键名及其相对应的值。
% 删除 schedulemap 中的“星期四”及其对应的科目。
% 在命令行窗口依次输入:
schedulemap = containers.Map({'Monday','Tuesday','Wednesday','Thursday',
'Friday'},{'Maths','Chinese','History','Geography','Biology'})
newMap = containers.Map()
remove(schedulemap,'Thursday')
keys(schedulemap)
values(schedulemap)
% 得到的结果如下:
ans =
Map (带属性):
Count: 4
KeyType: char
ValueType: char
ans = 'Friday' 'Monday' 'Tuesday' 'Wednesday'
ans = 'Biology' 'Maths' 'Chinese' 'History
(2)添加 keys/values 对象。
当用户向一个 map 对象中写入新元素的值时,需要提供键名,而且该键的类型必须和 map 中的其他键一致。该操作的调用格式为:
existingMapObj(newKeyName)= newValue
% 为 schedulemap 添加“星期六”及其对应的科目“public elective course”。
schedulemap('Saturday') = 'public elective course'
keys(schedulemap)
values(schedulemap)
% 得到结果如下:
得到的结果如下:
schedulemap =
Map (带属性):
Count: 6
KeyType: char
ValueType: char
ans = 'Friday' 'Monday' 'Saturday' 'Thursday' 'Tuesday'
'Wednesday'
ans = 'Biology' 'Maths' [1x22 char] 'Geography' 'Chinese'
'History'
(3)修改 keys。
如果需要在保持值不变的情况下对键名进行更改,首先要删除键名和对应的值,然后 再添加一个有正确键名的新条目。
修改“星期六”及其对应的科目“公共选 修课”为“星期天”及其对应的科目“MBA”。
remove(schedulemap,'Saturday');
schedulemap('Sunday') = 'MBA';
keys(schedulemap)
values(schedulemap)
% 程序运行结果如下:
ans = 'Friday' 'Monday' 'Sunday' 'Thursday' 'Tuesday' 'Wednesday'
ans = 'Biology' 'Maths' 'MBA' 'Geography' 'Chinese' 'History'
(4)修改 values。
通过赋值操作,覆盖原有的值,即可对 map 对象中的值进行修改。
修改“星期一”的科目为“英语”。 在命令行窗口依次输入:
schedulemap('Monday')
schedulemap('Monday') = 'english';
keys(schedulemap)
values(schedulemap)
% 程序运行结果如下:
ans = Maths
ans = 'Friday' 'Monday' 'Saturday' 'Thursday' 'Tuesday' 'Wednesday'
ans = 'Biology' 'english' 'MBA' 'Geography' 'Chinese' 'History'
‘Saturday’ ‘Thursday’ ‘Tuesday’
‘Wednesday’
ans = ‘Biology’ ‘Maths’ [1x22 char] ‘Geography’ ‘Chinese’
‘History’
**(3)修改 keys。**
**如果需要在保持值不变的情况下对键名进行更改,首先要删除键名和对应的值,然后 再添加一个有正确键名的新条目。**
修改“星期六”及其对应的科目“公共选 修课”为“星期天”及其对应的科目“MBA”。
```matlab
remove(schedulemap,'Saturday');
schedulemap('Sunday') = 'MBA';
keys(schedulemap)
values(schedulemap)
% 程序运行结果如下:
ans = 'Friday' 'Monday' 'Sunday' 'Thursday' 'Tuesday' 'Wednesday'
ans = 'Biology' 'Maths' 'MBA' 'Geography' 'Chinese' 'History'
(4)修改 values。
通过赋值操作,覆盖原有的值,即可对 map 对象中的值进行修改。
修改“星期一”的科目为“英语”。 在命令行窗口依次输入:
schedulemap('Monday')
schedulemap('Monday') = 'english';
keys(schedulemap)
values(schedulemap)
% 程序运行结果如下:
ans = Maths
ans = 'Friday' 'Monday' 'Saturday' 'Thursday' 'Tuesday' 'Wednesday'
ans = 'Biology' 'english' 'MBA' 'Geography' 'Chinese' 'History'