MATLAB中的数据类型主要包括数值类型、逻辑类型、字符串、函数句柄、结构体和单元数组类型。这六种基本的数据类型都是按照数组形式存储和操作的。
MATLAB中还有两种用于高级交叉编程的数据类型,分别是用户自定义的面向对象的用户类类型和Java类类型。
1.1.1数值类型
基础的数值类型只要有整数、单精度浮点型和双精度浮点型。
MATLAB中数值类型的数据包括有符号和无符号整数、单精度浮点数和双精度浮点数。在未加说明与特殊定义时,MATLAB对所有数值按照双精度浮点数类型进行存储和操作。
在需要时。可以指定系统按照整数类型或双精度浮点数类型对指定的数字或数组进行存储、运算等操作。相对于双精度浮点数类型,整数类型与单精度浮点数类型的优点在于节省变量占用的内存空间,当然要在满足精度要求的前提下。
提示:MATLAB会自动进行记忆体的使用和回收,而不像C语言,必须由使用者一一指定,这些功能使得MATLAB易学易用,使用者可专心致志于撰写程序。
1.整数类型
MATLAB中提供了8中内置的整数类型,这8种整数类型的存储占用位数、能表示的数值范围和转换函数均不同。
不同的整数类型所占用的位数不同,因此能够表示的数值范围也不同,在实际应用中,应根据实际需要合理选择合适的整数类型。
由于MATLAB中数值的默认存储类型是双精度浮点数类型,因此将变量设置为整数类型时,需要使用相应的转换函数,将双精度浮点数转换成指定的整数类型。
在转换过程中,MATLAB默认将带转换数值转换为与之最为接近的整数值,若小数部分为0.5,则转换后的结果为与该浮点数最为接近的两个整数中绝对值较大的一个。
另外,这些转换函数也可以将其他数据类型转换为指定的数据类型。在不超过数值范围的情况下,任意两个整数类型之间也可以通过转换函数进行相互转换。同时,由于不同的整数类型能够表示的数值范围不同,因此当运行结果超出对应的整数类型能够表示的范围时,就会出现错误,运算结果被指为该整数类型能够表示的最大值或最小值。
MATLAB中还包含了几类不同运算法则的取整函数,也可以把浮点数转换成整数。这些取整函数及相应的转换形式如下:
2.浮点数类型
MATLAB中提供了单精度浮点数类型和双精度浮点数类型,其存储位宽、能够表示的数值范围、数值精度各方面均不相同。
由上图可知,单精度浮点数类型的占用位数少,因此占用内存小,能够便是的数值范围和数值的精度都比双精度浮点数类型小。
由于MATLAB中的默认数值类型为双精度浮点数类型,因此与创建整数类型数值一样,也可以通过转换函数来实现创建单精度浮点数类型。
双精度浮点数在参与运算时,返回的类型依赖于参与运算的其他数据类型。当参与运算的其他数据类型为逻辑类型、字符类型时,返回结果为双精度浮点数类型;当参与运算的其他类型数据为整数类型时,返回的结果为相应的整数类型;当参与运算的其他数据为单精度浮点数类型时,返回结果为对应的单精度浮点数类型。
提示:在MATLAB中,单精度浮点数类型不能与整数类型进行算术运算。
例:浮点数参与的运算
输入:
a=uint32(120);b=single(22.809)c=73.226
ab=a*b
结果:
错误使用 *整数只能与同类的整数或双精度标量值组合使用。
输入:
ac=a*c
结果:
ac =uint328787bc=b*cbc =single1.6702e+03
输入:
str='hello'
结果:
str ='hello'
输入:
newstr=str-44.3
结果:
newstr =59.7000 56.7000 63.7000 63.7000 66.7000
输入:
whos
结果:
Name Size Bytes Class Attributesa 1x1 4 uint32 ac 1x1 4 uint32 b 1x1 4 single bc 1x1 4 single c 1x1 8 double newstr 1x5 40 double str 1x5 10 char
由于浮点数只占用一定的存储位宽,其中只有有限位分别用来存储指数部分和小数部分,因此,浮点数类型能够表示的实际数值是有限且离散的,任何两个最近相邻的浮点数之间都有微小间隙,而处在间隙中的数值只能用这两个相邻的浮点数之中的一个来表示。
MATLAB中提供了eps函数,可以获取一个数值和最接近该数值的浮点数之间的间隙。
例:浮点数的精度
输入:
format longps(3)
结果:
ans =4.440892098500626e-16
输入:
eps(single(3))
结果:
ans =single2.3841858e-07
3.复数
复数包括实部和虚部。MATLAB中默认使用字符i或j作为虚部的标志。在创建复数时,可以直接按照复数形式进行输入或者使用complex函数。MATLAB库函数中关于复数的相关函数如下:
4.穷量(Inf)和非数值量(NaN)
MATLAB中使用Inf和-Inf分别代表正无穷量和负无穷量,NaNcy表示非数值量。正负无穷量的产生一般是由于运算溢出,产生了超出双精度浮点数数值范围的结果;非数值量则是由于0/0或Inf/Inf类型产生的非正常运算而产生的,这两个NaN彼此是不相等的。
除了异常运算结果,MATLAB还提供了特定函数Inf和NaNcy来创建指定数值类型的无穷量,通常表示运算得到的数值结果超出了运算范围。非数的实部用NaNcy表示,虚部用Inf表示。
例:无穷量及非数值量的产生和性质
输入:
a=0/0,b=log(0),c=inf-inf
结果:
a =NaNb =-Infc =NaN
1.1.2逻辑类型
逻辑类型的数据就是指布尔类型的数据及数据之间的逻辑关系。除了传统的数学运算,MATLAB还支持关系和逻辑运算。这些运算的目的是提供求解真/假命题的答案。
作为所有关系个逻辑表达式的输入,MATLAB把任何非零数值当作真,把零当作假。所有关系和逻辑表达式的输出:对于真,输出为1;对于假,输出为0.
逻辑类型数据在进行运算时需要用到关系操作符和逻辑运算符。
MATLAB中的关系操作符能用来比较两个同样大小的数组,或用来比较一个数组和一个标量。在后一种情况中,标量和数组中的每一个元素相比较,结果与数组大小一样。
>> A=1:9,B=10-AA =1 2 3 4 5 6 7 8 9B =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(假)或非0(真)时返回0,否则返回1.
- any(x)指令的功能为盘带你是否为零向量或零矩阵(向量或矩阵中的元素全部为0),如果是非零向量或非零矩阵,则返回1,否则返回0.
除此之外,MATLAB还提供了大量的函数,在运算过程中用来测试特殊值或条件是否存在,并返回相应的表示结果的逻辑值。
1.1.3字符和字符串
在MATLAB中,文本当作特征字符串或简单地当作字符串。字符串能够现实在屏幕上,也可以用来构成一些命令,这些命令在其他的命令中用于求值或者被执行。
在MATLAB中可能会遇到对字符和字符串的操作。一个字符串是存储在一个行向量中的文本,这个行向量中的每一个元素代表一个字符。实际上,元素中存放的时字符的内部代码,即ASCII码。
当在屏幕上显示字符变量的值,显示出来的是文本,而不是ASCII数字。由于字符串是以向量的形式来存储的,因此可以提供它的下标对字符串中的任何一个元素进行访问。字符矩阵也可以通过下标索引进行访问,但是矩阵的每行字符数必须相同。
字符串一般是ASCII值得数值数组,它作为字符串表达式进行显示。
例:字符串属性示例。
>> String ='Every good boy dies fun.';>> size(String)ans =1 24
输入:
>> whosName Size Bytes Class AttributesString 1x24 48 char ans 1x2 16 double
一个字符串是由单引号括起来得简单文本。在字符串中的每个字符是数组中的一个元素,字符串的存储要求每个字符8字节,如同MATLAB的其他变量。
因为ASCII字符只要求一个字节,故这种存储要求是浪费的,7/8所分配的存储空间无用。然而,对字符串保持同样的数据结构可以简化MATLAB的内部数据结构。所给出的字符串操作并不是MATLAB的基本特点,但这种表达是方便和可接受的。
为了了解下面字符串的ASCII表达式,只需对字符串执行一些算术运算。最简单和计算上最有效的方法是取数组的绝对值。
例:字符串的ASCII表达。
>> String='Every good boy does fun.';>> U=abs(String)U =列 1 至 1969 118 101 114 121 32 103 111 111 100 32 98 111 121 32 100 111 101 115列 20 至 2432 102 117 110 46
输入:
>> U=U+0U =列 1 至 1969 118 101 114 121 32 103 111 111 100 32 98 111 121 32 100 111 101 115列 20 至 2432 102 117 110 46
在上例中,加字符串并没有改变它的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'
1.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()。
例:函数句柄的创建与调用。
>> F_Handle=@cosF_Handle =包含以下值的 function_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库函数中提供了大量关于处理函数句柄的操作函数,将函数句柄的功能与其他数据类型联系起来,扩展了函数句柄的应用。
例:函数句柄的基本操作。
>> F_Handle=@expF_Handle =包含以下值的 function_handle:@exp
输入:
>> F_Handleb=@logF_Handleb =包含以下值的 function_handle:@log
输入:
>> functions(F_Handle)ans =包含以下字段的 struct:function: 'exp'type: 'simple'file: ''
输入:
>> isa(F_Handle,'function_handle')%判断F_Handle是否为函数句柄ans =logical1
输入:
>> isequal(F_Handle,F_Handleb)%判断两个函数句柄是否对应一个函数ans =logical0
1.1.5结构体类型
MATLAB中的结构体与C语言中的结构体类似,一个结构体可以通过字段存储多个不同类型的数据。因此,结构体相当于一个数据容器,把多个相关联的不同类型的数据封装在一个结构体对象中。
一个结构体中可以有多个字段,每个字段又可以存储不同类型的数据,通过这种方式就把多个不同类型的数据组织在一个结构体对象中。
创建结构体对象的方法有两种,可以直接通过赋值语句给结构体的字段赋值,也可以使用结构体创建函数struct。两种方法的具体操作步骤如下:
1.通过字段赋值创建结构体变量。在对结构体字段进行赋值时,赋值表达式的变量名使用“结构体名称.字段名称”形式书写,对同一个结构体可以进行多个字段赋值。
例:通过字段赋值创建结构体。
>> Student.Name='Sam';>> Student.Grade=6;>> Student.Subject={'Chinese','Math','English'};>> Student.Rusult={99,99,99};>> StudentStudent =包含以下字段的 struct:Name: 'Sam'Grade: 6Subject: {'Chinese' 'Math' 'English'}Rusult: {[99] [99] [99]}
输入:
>> whosName Size Bytes Class AttributesStudent 1x1 1370 struct
在上例中,通过对4个字段赋值,创建了结构体对象Student,然后用whos函数分析出Student是一个1×1的结构体数组。
注意:在进行字段赋值操作时,没有明确赋值的字段,MATLAB默认值为空数组。通过圆括号索引进行字段赋值,还可以创建任意尺寸的结构体数组。需要注意的时,同一个结构体数组中的所有结构体对象具有相同的字段组合。
2.利用struct函数创建结构体。
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 数组:DayTimeNumber
输入:
>> Schedule(1)%结构体第一个元素没有赋值,因此所有字段均为空数组ans =包含以下字段的 struct:Day: []Time: []Number: []
输入:
>> ScheduleArray=repmat(struct('Day','Thursday','Time',15:00','Number',18),1,2)ScheduleArray =包含以下字段的 1×2 struct 数组:DayTimeNumber
输入:
>> ScheduleArray(1)%1×2的结构体数组的两个元素完全相同ans =包含以下字段的 struct:Day: 'Thursday'Time: '15:00'Number: 18
输入:
>> ScheduleArray(2)ans =包含以下字段的 struct:Day: 'Thursday'Time: '15:00'Number: 18
输入:
>> newArray=struct('Day',{'Thursday','Friday'},'Time',{'15:00','9:00'},'Number',{18,6})newArray =包含以下字段的 1×2 struct 数组:DayTimeNumber
输入:
>> newArray(1)ans =包含以下字段的 struct:Day: 'Thursday'Time: '15:00'Number: 18
输入:
>> newArray(2)ans =包含以下字段的 struct:Day: 'Friday'Time: '9:00'Number: 6
1.1.6数组类型
在MATLAB中进行运算的所有数据类型,都是按照数据及矩阵的形式进行存储和运算的,二者在MATLAB中的基本运算性质不同,数组强调元素对元素的运算,而矩阵则采用线性代数的运算方式。
数组的属性及数组之间的逻辑关系,是编写程序时非常重要的两个方面。在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开始、步长为1、到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)
在区间[a,b]上创建一个有n个元素的向量。这个命令和冒号表示形式相近,但是它直接定义了数据的个数。
例:创建等差数列。
>> Array_a=0:5,Array_b=linspace(0,5,6)Array_a =0 1 2 3 4 5Array_b =0 1 2 3 4 5
当属猪的元素为0时,就称数组为空。空数组是特殊的数组,它不含有任何元素。空数组主要用于逻辑运算、数组声明、数组的清空等。
例:创建空数组。
>> Array_Empty=[]Array_Empty =[]
1.1.7单元数组类型
1.概述
单元数组是一种无所不包的广义矩阵。组成单元数组的每一个元素称为一个单元。每一个单元可以包括一个任意数组,如数值数组、字符串数组、结构体数组或另外一个单元数组,因而每一个单元可以具有不同的尺寸和内存占用空间。
注意:和一般的数值数组一样,单元数组的维数不受限制,可以是一维、二维或多维。
MATLAB中使用单元数组的目的在于,它可以把不同类型的数据归到一个数组中。
注意:单元数组的创建方法有两种:使用赋值语句创建单元数组和利用cell函数创建空单元数组。
1.使用赋值语句创建单元数组。与一般数组有所不同的是,单元数组使用花括号“{}”来创建,使用逗号“,”或空格来分隔每一个单元,使用分号“;”来分行。
例:创建单元数组
>> C={'x',[1;3;6];10,pi}C =2×2 cell 数组{'x' } {3×1 double}{[10]} {[ 3.1416]}>> whosName Size Bytes Class AttributesC 2x2 458 cell
2.利用cell函数创建空单元数组。
cell函数的调用格式如下:
>> cellName=cell(m,n)
该函数创建一个m×n的空单元数组,其每一个单元均为空矩阵。
例:创建空单元数组
>> clear>> a=cell(2,2);>> b=cell(1);>> whosName Size Bytes Class Attributesa 2x2 32 cell b 1x1 8 cell
同一般的数值数组一样,单元数组的内存空间也是动态分配的。因此,使用cell函数创建空单元数组的主要目的是为该单元数组预先分配连续的存储空间,以节约内存占用,提高执行效率。
2.单元数组的寻访
在单元数组中,单元和单元中的内容是两个不同范畴的东西,因此,寻访单元和单元中的内容是两种不同的操作。MATLAB为上述两种操作设计了相应的操作对象:单元外标识和单元内编址。
对于单元数组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'}C =2×3 cell 数组{[ 3]} {3×2 double} {'string'}{[0.3827]} {[ 0]} {'code' }>> unirVal_1=C(2,2)unirVal_1 =1×1 cell 数组{[0]}>> class(unirVal_1)ans ='cell'>> unitVal_2=C{2,2}unitVal_2 =logical0>> class(unitVal_2)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 =2×2 cell 数组{'cellclass'} {[1 2 2]}{'abc' } {[9 5 6]}b =1×1 cell 数组{'Jan'}c =1×2 cell 数组{2×2 cell} {1×1 cell}
2.单元数组中指定单元的删除
如果要删除单元数组的某个单元,则只需将空矩阵赋给该单元,即:
C{m,n}=[]
例:有一个单元数组C,删除其中的某个单元
>> C={ones(3),'Hello,world',zeros(5),[20,4,6]};>> C{1,4}=[]C =1×4 cell 数组{3×3 double} {'Hello,world'} {5×5 double} {0×0 double}
3.使用reshape函数改变单元数组的形状。
reshape函数的调用格式为:
trimc=reshape(C,M,N)
该函数将单元数组C改为一个具有M行N列的新单元数组。
例:将上题中的单元数组C(1×4)改为newC(4×1)。
>> newC=reshape(C,4,1)newC =4×1 cell 数组{3×3 double }{'Hello,world'}{5×5 double }{0×0 double }
1.1.8map容器类型
1.map容器类型及map类概述
map的本意是映射,就是可以将一个量映射到另一个量。比如将一个字符串映射为一个数值,则该字符串就是map的键(key),数值就是map的数据(value)。因此,可以将map容器理解为一种快速查找数据结构的键。
对一个map元素进行寻访的索引称为“键”。一个键可以是以下任何一种数据类型:
(1)1×N字符串。
(2)单精度或双精度实数标量。
(3)有符号或无符号标量整数
这些键和其对应的数据存储在map中,一个map的每一个条目都包括唯一的键和相对应的数据。map中存储的数据可以是任何类型的,包括数值类型、字符或字符串类型、结构体类型、单元类型或者其他map。
一个map是MATLAB类的一个对象。map类的所有对象具有三个属性。用户不能直接对这些属性进行修改,但可以通过作用于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,...})
例:创建一个名为schedulemap的map对象来存储课表。
创建过程如下:
>> schedulemap=containers.Map({'Monday','Tuesday','Wendesday','Thursday','Friday'},{'Maths','Chinese','History','Geography','Biology'})schedulemap =Map - 属性:Count: 5KeyType: charValueType: char
此外,map对象的创建可以分为两个步骤:首先创建一个空的map对象;然后使用keys和values方法对其内容进行补充。空map对象创建方法如下:
>> newMap=containers.Map()newMap =Map - 属性:Count: 0KeyType: charValueType: any
3.查看/读取map对象
1.查看map对象
map对象中的每个条目包括两个部分:一个唯一的键及对应的值。可以通过使用keys函数查看map对象中包含的所有的键;通过values函数查看所有的值。
例:查看课程表中的map对象
>> keys(schedulemap)ans =1×5 cell 数组{'Friday'} {'Monday'} {'Thursday'} {'Tuesday'} {'Wendesday'}>> values(schedulemap)ans =1×5 cell 数组{'Biology'} {'Maths'} {'Geography'} {'Chinese'} {'History'}
2.读取map对象
在创建好一个map对象后,用户可以对其进行数据的访问。寻访指定键所对应的值使用的格式如下:
valueName=mapName(keyName)
当键名是一个字符串时,需使用但括号将键名括起来。
例:通过使用键名访问schedulemap对象的内容
>> course=schedulemap('Wendesday')course ='History'如果需要对多个键进行访问,可以使用values函数:>> values(schedulemap,{'Monday','Thursday'})ans =1×2 cell 数组{'Maths'} {'Geography'}
提示:在对多个键进行访问时,不能像其他数据类型那样使用冒号“:”,这将导致错误的产生。例如:
>> schedulemap('Monday':'Thursday')
警告: 冒号操作数必须为实数标量。
错误使用 索引
此容器中不存在指定的键。
4.编辑map对象
1.从map对象中删除keys/values对
用户可以使用remove函数从map对象中删除keys/values对,该函数的调用格式为:
remove('mapName','KeyName')
式中,mapName和keyName分别为map对象名称及需要删除的键名。执行该命令后,MATLAB系统删除指定的键名及相对应的值。
例:删除schedulemap对象中的“星期四“及其对应的科目。
>> newMap=containers.Map()newMap =Map - 属性:Count: 0KeyType: charValueType: any>> schedulemapschedulemap =Map - 属性:Count: 5KeyType: charValueType: char>> remove(schedulemap,'Thursday')ans =Map - 属性:Count: 4KeyType: charValueType: char>> keys(schedulemap)ans =1×4 cell 数组{'Friday'} {'Monday'} {'Tuesday'} {'Wendesday'}>> values(schedulemap)ans =1×4 cell 数组{'Biology'} {'Maths'} {'Chinese'} {'History'}
2.添加keys/values对
当用户向一个map对象中写入新元素的值时,需要提供键名,而且该键的类型必须和map中的其中键一致。该操作的调用格式为:
existingMapObj(newKeyName)=newValue
例:为schedulemap对象添加“星期六”及其对应的科目“public elective course”
>> schedulemap('Staurday')='public elective course'schedulemap =Map - 属性:Count: 5KeyType: charValueType: char>> keys(schedulemap)ans =1×5 cell 数组{'Friday'} {'Monday'} {'Staurday'} {'Tuesday'} {'Wendesday'}>> values(schedulemap)ans =1×5 cell 数组{'Biology'} {'Maths'} {'public elective…'} {'Chinese'} {'History'}
3.修改keys。
如果需要在保持值不变的情况下对键名进行更改,则首先要删除键名和其对应的值,然后再添加一个由正确键名的新条目。
例:对schedulemap对象的结果,修改“星期六”及其对应的科目“公共选修课”为“星期天”及其对应的科目“MBA”。
>> remove(schedulemap,'Staurday');>> schedulemap('Sunday')='MBA';>> keys(schedulemap);>> values(schedulemap)ans =1×5 cell 数组{'Friday'} {'Monday'} {'Sunday'} {'Tuesday'} {'Wendesday'}ans =1×5 cell 数组{'Biology'} {'Maths'} {'MBA'} {'Chinese'} {'History'}
4.修改values
通过赋值操作,覆盖原有的值,即可对map对象中的值进行修改。
例:修改“星期一”的科目为“英语”
>> schedulemap('Monday')ans ='Maths'>> schedulemap('Monday')='English';>> keys(schedulemap)ans =1×5 cell 数组{'Friday'} {'Monday'} {'Sunday'} {'Tuesday'} {'Wendesday'}>> values(schedulemap)ans =1×5 cell 数组{'Biology'} {'English'} {'MBA'} {'Chinese'} {'History'}
1.2基本矩阵操作
1.2.1矩阵的基本概念
对矩阵的基本操作,主要有矩阵的构造、矩阵大小及结构的改变、矩阵下标引用、矩阵信息的获取。对于这些操作,MATLAB中都有固定指令或相应的库函数与之相对应。
在数学上,定义由m×n个数aij(i=1,2,…,m;j=1,2,…,n)排成的m行n列的数表。
只有一行的矩阵称为行向量。
只有一列的矩阵称为列向量。
矩阵最早来自方程组的系数及常数所构成的方阵,这一概念在19世纪提出。数组是在程序设计中,为了方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。
在MATLAB中,一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或者构造类型。因此,按数组元素的类型不同,数组又可分为数值数组、字符数组、单元数组、结构数组等。
由此可见,矩阵和数组在MATLAB中存在很多方面的区别,主要有以下几个方面:
- 矩阵是数学上的概念,而数组是计算机程序设计领域的概念。
- 作为一种变换或者映射运算符的体现,矩阵运算有着明确而严格的数学规则;而数组运算是MATLAB软件定义的规则,其目的是使数据管理方便,操作简单,命令形式自然,执行计算有效。
两者间的联系主要体现在:在MATLAB中,矩阵是以数组的形式存在的,因此,一维数组相当于向量,二维数组相当于矩阵,所以矩阵是数组的子集。
1.2.2矩阵的构造
矩阵的构造方式有两种,一种是与单元数组相似,可以对变量直接进行赋值;另一种是使用MATLAB中提供的构造特殊矩阵的函数。
1.建立简单矩阵
简单矩阵采用矩阵后遭符号——方括号“[]”,将矩阵元素置于方括号内,同行元素之间用空格或者逗号隔开,行与行之间用封号“;”隔开,格式如下:
matrixName=[element11,element12,element13;element21,element22,element23]matrixName=[element11 element12 element13;element21 element22 element23]
例:简单矩阵构造实例
分别构造一个二维矩阵、一个行向量、一个列向量。
>> A=[2,3,5;3,6,10]%使用逗号和分号构造二维矩阵A =2 3 53 6 10>> B=[2 3 5;3 6 10]%使用空格和分号构造二维矩阵B =2 3 53 6 10>> V1=[8 59 60 33]%构造行向量V1 =8 59 60 33>> V2=[5;8;3;4;9]%构造列向量V2 =58349
2.建立特殊矩阵
特殊矩阵是指非零元素或零元素的分布有一定规律的矩阵,常见的特殊矩阵有对称矩阵、三角矩阵和对角矩阵。
例:特殊矩阵构造示例
OnesMatrix=ones(2),ZerosMAtrix=zeros(2),Indetity=eye(2)...Indentuty23=eye(2,3),Indenytity32=eye(3,2)
>> OnesMatrix=ones(2),ZerosMAtrix=zeros(2),Indetity=eye(2),Indentuty23=eye(2,3),Indenytity32=eye(3,2)
OnesMatrix =1 11 1
ZerosMAtrix =0 00 0
Indetity =1 00 1
Indentuty23 =1 0 00 1 0
Indenytity32 =1 00 10 0
输入:
>> Random=rand(2,3),Array=Random(:,3),Diagelement=diag(Random),Diagmatrix=diag(diag(Random)),Dmatrix_array=diag(Array),UpperTriangular=triu(Random),LowerTriangular=tril(Random)
Random =0.9572 0.8003 0.42180.4854 0.1419 0.9157
Array =0.42180.9157
Diagelement =0.95720.1419
Diagmatrix =0.9572 00 0.1419
Dmatrix_array =0.4218 00 0.9157
UpperTriangular =0.9572 0.8003 0.42180 0.1419 0.9157
LowerTriangular =0.9572 0 0
0.4854 0.1419 0
3.向量、标量和空矩阵
通常情况下,矩阵包含m行n列,即m×n。当m和n取一些特殊值时,得到的矩阵具有一些特殊的性质。
1.向量
当m=1或n=1,即1×n或m×1时,建立的矩阵称为向量。
>> a=[1 2 3 4 5 6]a =1 2 3 4 5 6>> b=[1;2;3;4;5;6]b =123456
2.标量
当n=1=m时,建立的矩阵成为标量。任意以1×1的矩阵形式表示的单个实数、复数都是标量。
>> x=10+2i%将复数10+2i赋值给变量xx =10.0000 + 2.0000i>> shape=size(x)%查询变量x的形状信息shape =1 1>> y=[10+2i]%将复数10+2i构成的矩阵赋值给变量yy =10.0000 + 2.0000i>> shape=size(y)%查询变量y的形状信息shape =1 1>> x==y%判断变量x和y是否相等ans =logical1
通过上述示例可知,单个实数或复数在MATLAB中都是以矩阵的形式存储的;在MATLAB中,单个数据或由单个数据构成的矩阵都是标量
3.空矩阵
当m=n=0时,或者m=0,或者n=0,即0×0、m×0、0×n时,创建的矩阵称为空矩阵。空矩阵可以通过赋值语句建立。
>> x=[]%建立一个空矩阵x =[]>> whos%调用whos函数查看变量x的相关信息Name Size Bytes Class Attributesx 0x0 0 double 而再建立一个0矩阵,可以输入:>> z=[0 0 0:0 0 0]%建立一个2行3列的0矩阵z =0 0 0 0 0>> whos z%调用whos函数查看变量z的相关信息Name Size Bytes Class Attributesz 1x5 40 double
空矩阵和0矩阵的本质区别在于:空矩阵内没有任何元素,因此不占用任何存储空间;而0矩阵表示该矩阵中的所有元素全部为0,需要占用一定的存储空间。
1.2.3矩阵大小及结构的变化
根据运算时的不同情况和需要,矩阵大小及结构的改变方式主要有旋转矩阵、改变矩阵维度、删除矩阵元素等。MATLAB中提供了具体此类函数如下图所示:
1.2.4矩阵下标引用
在MATLAB中,普通二维数组元素的数字索引分为双下标索引和单下标索引。双下表索引是通过一个二元数组对来对应元素在矩阵中的行列位置。单下标索引的方式是采用列元素优先的原则,对m行n列的矩阵按列排列进行重组,成为一维数组,再去新的一维数组中的元素位置对应的值作为元素在原矩阵中的单下标。例如在4×4的矩阵,A(7)表示矩阵A中地行第2列的元素,而A(13)表示矩阵A中第一行第4列的元素。
1.矩阵下标访问单个矩阵元素
常用的矩阵索引表达式如下图:
例:矩阵下标引用示例
>> Matrix=magic(6)Matrix =35 1 6 26 19 243 32 7 21 23 2531 9 2 22 27 208 28 33 17 10 1530 5 34 12 14 164 36 29 13 18 11>> Submatrix=Matrix(2:3,3:6)Submatrix =7 21 23 252 22 27 20>> Array=Matrix([7:10 26:31])Array =1 32 9 28 23 27 10 14 18 24
2.线性引用矩阵元素
矩阵中某一元素的单下标索引值和双下标索引值之间,可以提供MATLAB内部函数进行转换,其句法形式:
IND=sub2ind(siz,i,j)
其功能为将双下标索引值转换为单下标索引值,其中siz是一个包含两个元素的数组,代表了转换矩阵的行列数,一般可以直接用siz(A)表示;i与j分别表示双下标索引中的行、列值;IND是转换后的单下标索引。
[I,J]=ind2sub(size,ind)
其功能是将单下标索引值转换为双下标索引值,各变量意义同上。
例:矩阵元素单双下标索引值转换示例
>> Matrix=magic(3);>> IND=sub2ind(size(Matrix),2,3);>> [I J]=ind2sub(size(Matrix),7)IND =8I =1J =3
3.访问多个矩阵元素
设A=magic(4),如果需要计算第4列元素的和,按照前面介绍的方法则可以用一下表达式来实现:
A(1,4)+A(2,4)+A(3,4)+A(4,4)
在下标表达式中,可以用冒号来表示矩阵的多个元素,例如,A(1:k,j)表示矩阵第j列的前k个元素。利用冒号,计算第4列元素的和可以用更为简洁的式子:
sum(A(1:4,4))
还有更简洁的方法,因为冒号本身可以表示为一列或一行的所有元素,所以上式还可表示为:
sum(A(:4))
在MATLAB中提供了一个关键字end,表示该维中最后一个元素,所以上式还可以改写成:
sum(A(:end))
实际上还可以用冒号来表示非相邻的多个元素:
>> A=1:10;>> B=A(1:3:10)A =1 2 3 4 5 6 7 8 9 10B =4 7 10
1.2.5矩阵信息的获取
矩阵的信息主要包括矩阵结构、矩阵大小、矩阵维度、矩阵的数据类型及矩阵占用的内存等。
1.矩阵结构
矩阵的结构使之矩阵子元素的排列方式。MATLAB提供了各种测试函数,如下图:
这类函数的返回值是逻辑类型的数据,返回值为“1”表示该矩阵是某一特定类型的矩阵;返回值为“0”表示矩阵不是该特定类型的矩阵。
例:矩阵数据结构判断函数的使用方法示例
利用zeros函数生成一个4×4、元素全为0的矩阵A,并判断矩阵A的数据结构。
>> A=zeros(4,4)A =0 0 0 00 0 0 00 0 0 00 0 0 0
再用各种函数判断矩阵A的数据结构。
>> isempty(A)%判断矩阵A是否为空矩阵ans =logical0>> isscalar(A)%判断矩阵A是否为标量ans =logical0>> isvector(A)%判断矩阵A是否为向量ans =logical0>> issparse(A)%判断矩阵A是否为稀疏矩阵ans =logical0
2.矩阵大小
矩阵的形状信息反映了矩阵的大小,通常又包括一下几个方面的内容:
- 矩阵的维数;
- 矩阵各维(如最长维、用户指定的维)的长度;
- 矩阵元素的个数。
针对上述3个方面的信息,相应地,MATLAB提供了4个函数,分别用于获取矩阵形状的相关信息。
例:矩阵形状信息查询函数的使用示例
下面程序利用eye函数建立一个5×3的矩阵,利用ndims函数获取矩阵A的维数信息。
>> A=eye(5,3)A =1 0 00 1 00 0 10 0 00 0 0
下面利用ndims函数获取矩阵A的维数信息。
>> ndims(A)ans =2
利用length函数获取矩阵A最长维的长度
>> length(A)ans =5
利用size函数获取矩阵A各维的长度
>> size(A)ans =5 3>> [m n]=size(A)m =5n =3>> d=size(A)d =5 3>> e1=size(A,1)e1 =5>> e2=size(A,2)e2 =3
由上述size函数的应用可知:①size函数的返回值可以是分开显示的单个实数变量,也可以是一个行变量;②在size函数的输入参数中增加维度参数可以获取指定维度的长度,其中“1”代表行,“2”表示列。
使用numel函数(numel是number of elements的简写)可以获取矩阵A中元素的个数。
>> f=numel(A)f =15
例:数值与矩阵的算术运算示例。
>> A=[];B=1:4;C=[1:4;5:8];>> S1=size(A)S1 =0 0>> S2=size(B)S2 =1 4>> S3=length(B)S3 =4>> S4=size(C)S4 =2 4>> S5=length(C)S5 =4>> S6=numel(C)S6 =8
3.矩阵维度
对于空矩阵、标量矩阵、一维数组和二维矩阵,MATLAB都将其作为普通二维数组对待。特别需要注意的是,用[]产生的空矩阵作为二维矩阵的,但是在高维矩阵中也有空矩阵的概念,此时空矩阵则具有多个维度。
MATLAB中提供了ndims函数计算矩阵维度
例:计算矩阵维度示例
>> A=[];B=5;C=1:3;D=magic(2);E(:,:,2)=[1 2;3 4];>> Nidms=[ndims(A) ndims(B) ndims(C) ndims(D) ndims(E)]Nidms =2 2 2 2 3
4.矩阵的数据类型
矩阵作为MATLAB的内部数据存储和运算结构,其元素可以是各种各样的数据类型,对应不同数据类型的元素,可以是数值、字符串、元胞、结构体等。MATLAB中提供了一系列数据类型的测试函数,如下图:
这类函数的返回值也是逻辑类型的数据。返回值为“1”表示是某一特定的数据类型;返回值为“0”表示不是该特定的数据类型。
例:矩阵元素的数据类型的判断示例
>> A=[2 3;10 7]A =2 310 7>> isnumeric(A)ans =logical1>> isfloat(A)ans =logical1>> islogical(A)ans =logical0建立一个字符串矩阵B并进行判断。>> B=['MATLAB';'course']B =2×6 char 数组'MATLAB''course'>> isstruct(B)ans =logical0>> ischar(B)ans =logical1
例:矩阵的数据类型示例
>> Mat=magic(2);>> TrueorFalse=[isnumeric(Mat) isinteger(Mat) isreal(Mat) isfloat(Mat)]TrueorFalse =1×4 logical 数组1 0 1 1
例:将矩阵A中的实数和复数分开一个具有实数和复数的矩阵示例
>> clear all>> A=[2 6.5 3i 3.5 6 4+2i];%定义一个具有实数和复数的矩阵>> real_array=[];%定义存储实数和复数的矩阵目前为空矩阵>> complex_array=[];>> for i=1:length(A),if isreal(A(i))==1,%判断矩阵元素是否为实数real_array=[real_Array A(i)];elsecomplex_array=[complex_array A(i)];end;end;>> for i=1:length(A),if isreal(A(i))==1,%判断矩阵元素是否为实数real_array=[real_array A(i)];elsecomplex_array=[complex_array A(i)];end;end;>> real_array%输出实数元素real_array =2.0000 6.5000 3.5000 6.0000>> complex_array%输出复数元素complex_array =0.0000 + 3.0000i 4.0000 + 2.0000i
5.矩阵占用的内存
了解矩阵的内存占用情况,对于优化MATLAB代码性能是十分重要的。使用者可以通过whos命令查看当前工作区中指定变量的所以信息,包括变量名、矩阵大小、内存占用情况和数据类型等。
例:查看矩阵占用的内存示例
>> Matrix=rand(2)Matrix =0.8147 0.12700.9058 0.9134>> whos MatrixName Size Bytes Class AttributesMatrix 2x2 32 double
1.2.6矩阵的保存和加载
设有矩阵A=[1 2 3;4 5 6;7 8 9],现用户希望将元素1改为-1,并将5、6、8、9这几个矩阵元素以0替换,之后再原始矩阵的最后添加一行,使得新的矩阵A满足某方面的使用要求,因此,用户首先要通过一定的途径让MATLAB找到元素“1”及元素“5 6 8 9”,接着对这些矩阵元素的值进行修改,最后增加一行。上述几方面构成了矩阵元素的基本操作。
1.矩阵在MATLAB中的存储方式
设有矩阵A=[1 0 -1;2 4 9;-5 3 0]直接输入矩阵元素来创建矩阵。
>> A=[1 0 -1;2 4 9;-5 3 0]A =1 0 -12 4 9-5 3 0
事实上,MATLAB并不是按照其命令行输入的格式将矩阵A存储在内存空间中的。可以把内存空间想象成一列网格,如下图所示:
MATLAB将矩阵元素按列哟先排列的原则依次放置在相应的格子内,因此吗,可以将其看作一个长列向量。
例如,矩阵第2行第2列的元素“4”,实际上位于存储空间第5个格子的位置上。由此,MATLAB采用两种矩阵元素寻址方法:①矩阵小标寻址;②线性寻址。
2.矩阵元素的寻址方法
1.矩阵下标寻址
在MATLAB中,使用A(i,j)来表示一个矩阵A从左上角起第i行、第j列的元素,这就是矩阵下标寻址方法。这种方法和线性代数中矩阵元素的引用方法一致,通俗易懂。以下分别介绍利用矩阵小表寻址方法访问矩阵中的单个元素和元素区域。
1.单个矩阵元素的访问
当使用双下标访问二维矩阵中的某个元素时,必须同时指定该元素所在的行号和列号,访问格式如下:
A(numRow,numColumn)
其中,numRow和numColumn分别代表行号和列号
例:单个矩阵元素的访问示例
利用rand函数创建一个4×3的0~1均匀分布的随机数矩阵A并访问其中的元素。
>> A=rand(4,3)A =0.8147 0.6324 0.95750.9058 0.0975 0.96490.1270 0.2785 0.15760.9134 0.5469 0.9706>> x=A(2,2)x =0.0975>> y=A(4,3)y =0.9706
2.矩阵元素区域访问
访问矩阵多个元素,可以是某一行、某一列或者其中的部分元素,也可以是矩阵中的某一块区域。在MATLAB中,元素区域的访问需要用“:”来表示矩阵中的多个元素,具体访问格式如下:
- A(1:m,n)——表示访问第n列的第一个元素至第m个元素。
- A(m,:)——表示访问第m行的所有元素。
- A(i:j,m:n)——表示访问从第i行到第j行、第m列到第n列的矩阵区域。
- A(i:inc1:j,m:inc2:n)——表示访问从dii行至第j行,行间隔inc1,从第m列至第n列,列间隔为inc2的非相邻的多个矩阵元素。
例:矩阵元素区域的访问示例
利用randn函数创建一个10×8的0~1正太分布随机矩阵X并进行访问。
>> X=randn(10,8)X =0.7254 0.7172 -1.0689 0.3192 -1.2141 0.5525 -0.1924 0.1978-0.0631 1.6302 -0.8095 0.3129 -1.1135 1.1006 0.8886 1.58770.7147 0.4889 -2.9443 -0.8649 -0.0068 1.5442 -0.7648 -0.8045-0.2050 1.0347 1.4384 -0.0301 1.5326 0.0859 -1.4023 0.6966-0.1241 0.7269 0.3252 -0.1649 -0.7697 -1.4916 -1.4224 0.83511.4897 -0.3034 -0.7549 0.6277 0.3714 -0.7423 0.4882 -0.24371.4090 0.2939 1.3703 1.0933 -0.2256 -1.0616 -0.1774 0.21571.4172 -0.7873 -1.7115 1.1093 1.1174 2.3505 -0.1961 -1.16580.6715 0.8884 -0.1022 -0.8637 -1.0891 -0.6156 1.4193 -1.1480-1.2075 -1.1471 -0.2414 0.0774 0.0326 0.7481 0.2916 0.1049>> A=X(2,:)A =-0.0631 1.6302 -0.8095 0.3129 -1.1135 1.1006 0.8886 1.5877>> B=X(3:8,2:6)B =0.4889 -2.9443 -0.8649 -0.0068 1.54421.0347 1.4384 -0.0301 1.5326 0.08590.7269 0.3252 -0.1649 -0.7697 -1.4916-0.3034 -0.7549 0.6277 0.3714 -0.74230.2939 1.3703 1.0933 -0.2256 -1.0616-0.7873 -1.7115 1.1093 1.1174 2.3505
2.线性寻址
线性寻址的原理来自MATLAB将矩阵元素存储在内存空间内的存储方法。与矩阵下标寻址相比,线性寻址只需要单一下标即可实现矩阵中任意位置元素的访问。线性寻址的下标是通过矩阵的双下标换算得到的。
一般,设矩阵是m×n的矩阵,位于第i行、第j列的元素A(i,j)的单一下标为A((j-1)*m+1)
例:线性寻址示例
建立3阶希尔伯特矩阵A,并进行线性寻址访问。
>> A=hilb(3)A =1.0000 0.5000 0.33330.5000 0.3333 0.25000.3333 0.2500 0.2000>> A(2,3)%采用矩阵下标寻址的方法访问di2行第3列的元素ans =0.2500>> A(8)ans =0.2500
3.矩阵元素的赋值
MATLAB使用赋值语句对矩阵元素进行赋值,基本语法如下:
- A(i,j)=value:等号左侧为矩阵中的某个元素;等号右侧为值。
- A=[]:删除矩阵中的所有元素。
例:矩阵元素的赋值示例
利用magic函数建立一个4阶的魔幻矩阵M,并进行赋值操作。
>> M=magic(4)M =16 2 3 135 11 10 89 7 6 124 14 15 1>> M(2,1)=-2M =16 2 3 13-2 11 10 89 7 6 124 14 15 1>> M(3:4,3:4)=0M =16 2 3 13-2 11 10 89 7 0 04 14 0 0>> M=[]M =[]>> whos M%调用whos函数查看矩阵M的详细信息Name Size Bytes Class AttributesM 0x0 0 double
4.矩阵元素的扩展与删除
增加或删除矩阵元素最常用的方法是使用赋值语句。
例:对于矩阵A=[1 1;2 2],如果现在要增加一行,输入:
>> A=[1 1;2 2]A =1 12 2>> A(3,:)=3%整行赋值A =1 12 23 3>> A(4,1)=4;A(4,2)=5%使用但矩阵元素赋值的方法增加新元素A =1 12 23 34 5>> A(2,:)=[]%使用空矩阵[]删除矩阵中的整行或整列A =1 13 34 5
此外,MATLAB中还提供了多个函数进行矩阵合并操作,从而实现将多个矩阵合并成一个矩阵。
例:矩阵合并函数示例
- 设有矩阵A=[2 0 -1;1 3 2]、矩阵B=[1 7 -1;4 2 3;2 0 1]、矩阵C=[1 0 1 0;-1 2 0 1],利用cat函数分别对矩阵A、B及矩阵A、C进行合并操作,函数中的输入参数DIM分别分别取DIM=1和DIM=2。
>> A=[2 0 -1;1 3 2];B=[1 7 -1;4 2 3;2 0 1];C=[1 0 1 0;-1 2 0 1];>> MAB1=cat(1,A,B)%将矩阵A、B按行合并MAB1 =2 0 -11 3 21 7 -14 2 32 0 1
如果合并错误,如:
>> MAB2=cat(2,A,B)%将矩阵A、B按列合并错误使用 cat要串联的数组的维度不一致。>> MAC1=cat(1,A,C)%将矩阵A、C按行合并错误使用 cat要串联的数组的维度不一致。使用cat函数对矩阵A、C进行合并成操作>> MAC2=cat(2,A,C)%将矩阵按列合并MAC2 =2 0 -1 1 0 1 01 3 2 -1 2 0 1
为了探究A、B按列合并及矩阵A、C按行合并发生错误的而原因,将合并后的矩阵列出来:
可以看出,由于两个矩阵在某个维度上的长度不一致,从而道中新的矩阵出现残缺。
因此,cat及其相关的函数在将两个矩阵按某个维度进行合并操作时,原始的两个矩阵在某一维度上具有相同的长度,否则MATLAB在进行计算时就会发生错误。
5.使用blkdiag函数构造块对角化矩阵。
>> A=[1 1;2 2];B=[3 3;4 4];C=[5 5;6 6];>> Y=blkdiag(A,B,C)Y =1 1 0 0 0 02 2 0 0 0 00 0 3 3 0 00 0 4 4 0 00 0 0 0 5 50 0 0 0 6 6
1.3 运算符
MATLAB中的运算符分为算术运算符、关系运算符和逻辑运算符。这三种运算符可以分别使用,也可以在同一运算式中出现。当同一运算式中同时出现两种或者两种以上运算符时,运算的优先级排列如下:算术运算符优先级最高,其次是关系运算符,最后才是逻辑运算符。
1.3.1 算术运算符
MATLAB中的算术运算符有加、减、乘、除、点乘、点除等,其运算法则如下:
例:数值与矩阵的算术运算示例
>> A=eye(2),B=ones(2),C=A*B,D=A.*BA =1 00 1B =1 11 1C =%A与B两个矩阵相乘1 11 1D =%A与B两个矩阵的每个元素分别相乘1 00 1
MATLAB平台还提供了大量的运算函数,其中常用的运算函数如下表:
1.3.2 关系运算符
MATLAB中的关系运算符有6个,具体如下:
注意:“=”和“==”的区别:“==”的运算法则时比较两个变量,当它们相等的时候返回1,当它们不相等的时候返回0;而“=”则被用来将运算结果赋给一个变量。
关系运算符可以用来对两个数值、两个数组、两个矩阵或两个字符串等数据类型进行比较,同样也可以进行不同数据类型的两个数据之间的比较。比较方式根据所比较的两个数据类型的不同而不同。
关系运算符通过比较对应的元素,产生一个仅包含和0的数值或矩阵。其元素代表的意义如下:
- 返回值为1,比较结果为真。
- 返回值为0,比较结果为假。
例:关系运算符的运用
>> A=1:9,B=10-AA =1 2 3 4 5 6 7 8 9B =9 8 7 6 5 4 3 2 1>> TrueorFalse=(A>4)TrueorFalse =1×9 logical 数组0 0 0 0 1 1 1 1 1
例:关系运算符的运算
>> C=5:-1:0;C=C+(C==0)*epsC =5.0000 4.0000 3.0000 2.0000 1.0000 0.0000
提示:上述中利用特殊的MATLAB数eps代替一个数组中的零元素,eps接近于2.2e-16.这种特殊的表达式子啊避免0作为分母时是很有用的。
1.3.3逻辑运算符
逻辑预算符提供了一种组合或否定关系表达式。MATLAB中的逻辑运算符如下图:
例:逻辑运算符的运用
>> A=1:9A =1 2 3 4 5 6 7 8 9>> TrueorFalse=~(A>4)TrueorFalse =1×9 logical 数组1 1 1 1 0 0 0 0 0>> TrueorFalse=(A>2)&(A<6)TrueorFalse =1×9 logical 数组0 0 1 1 1 0 0 0 0
与关系运算符一样,逻辑运算符也可以进行矩阵与数值之间的比较,比较方式为将矩阵的每一个元素都与数值进行比较,比较结果为一个相同维数的矩阵,新生成矩阵中的每一个元素都代表着原来矩阵相同位置上的元素与该数值的逻辑运算结果。
在使用逻辑运算符比较两个相同维数的矩阵时,是按元素来进行比较的,其结果是一个包含0和1的矩阵。元素0表示逻辑为假,元素为1表示逻辑为真。
A&B返回一个与A和B相同维数的矩阵。在这个矩阵中,当A和B对应元素都为非零时,对应项为1;当有一个为0时,对应项为0;
A|B返回一个与A和B相同维数的矩阵。在这个矩阵中,当A和B对应元素只要有一个为非零时,对应项为1;当两个元素均为为0时,对应项为0;
~A返回一个与A相同维数的矩阵。在这个矩阵中,当A对应元素为非零时,对应项为0;当元素为0时,对应项为1;
除上面的逻辑运算符之外,MATLAB还提供了各种逻辑运算符,如下图:
1.3.4 运算优先级
在一个表达式中,算术运算符的优先级最高,其次是关系运算符,最后是逻辑运算符。需要时,可以通过加括号来改变运算顺序。
提示:在表达式书写中,建议采用括号分级的方式明确运算的先后顺序,避免优先级混乱而产生运算错误。
1.4字符串处理函数
MATLAB中提供了大量的字符串处理函数。
1.4.1 字符串的构造
字符串或字符串数组的构造可以提供直接给变量赋值来实现,具体表达式中字符串的内容需要写在单引号内。如果字符串的的内容包含单引号,那么以两个重复的单引号来表示。
在构造多行字符串时,如字符串内容写在[]内,那么多行字符串的长度必须相同;若字符串内容写在{}内,则多行字符串的长度可以不同。
例:直接赋值构造字符串示例
>> Str_a='How are you?',Str_b='I dont''t know',Str_c=strcat(Str_a,Str_b)Str_a ='How are you?'Str_b ='I dont't know'Str_c ='How are you?I dont't know'>> Str_mat=['July';'August';'September';]错误使用 vertcat要串联的数组的维度不一致。>> Str_mat1=['U r a man.';'I''m a pen.']Str_mat1 =2×10 char 数组'U r a man.''I'm a pen.'>> Str_mat2={'July';'August';'September';}Str_mat2 =3×1 cell 数组{'July' }{'August' }{'September'}
MATLAB还提供了stvcat和char函数用于纵向连接多个字符串。在使用strvcat函数连接多行字符串时,每行字符串的长度不要求相等,所有非最长字符串的右边会自动步长空格,使得每行字符串的长度相等。char函数与strvcat函数类似,不过当多行字符串中有空字符串时,strvcat函数会自动进行忽略,而char函数会把空字符串也有空格补偿后再进行连接。
例:构造字符串示例
>> A='top';B='';C='Bottom';>> sABC=strvcat(A,B,C),cABC=char(A,B,C),size=[size(sABC);size(cABC)]sABC =2×6 char 数组'top ''Bottom'cABC =3×6 char 数组'top '' ''Bottom'size =2 63 6
1.4.2 字符串比较函数
两个字符串之间的关系可以提供关系运算符来比较,也可以使用strcmp函数进行比较两个字符串是否相等。
例:比较字符串示例
>> A=(' Hello '==' Word ')矩阵维度必须一致>> A=(' Hello '==' World ')A =1×7 logical 数组1 0 0 0 1 0 1>> B=(' Hello '==' Hello ')B =1×7 logical 数组1 1 1 1 1 1 1>> C=strcmp(' Hello ',' World ')C =logical0>> D=strcmp(' Hello ',' Hello ')D =logical1
提示:在使用关系运算符进行比较时,会对字符串的每个字符进行比较,返回值是一个与字符串长度相等大小的数组,因此被比较的两个字符串的长度必须相等;而strcmp函数则根据两个字符串相等与否,返回值为0或1.
1.4.3 字符串查找和替换函数
字符串查找与搜索可以提供findstr函数来实现
例:按下标值查找字符串示例
>> String ='Peter Piper picked a peck of pickled peppers.';>> findstr(String,' ')%查找字符串内空格的位置ans =6 12 19 21 26 29 37>> findstr(String,'p')%搜索字母pans =9 13 22 30 38 40 41>> findstr(String,'cow')%搜索字单词cowans =[]>> findstr(String,'pick')%搜索字单词pickans =13 30
提示:findstr函数对字母的大小时敏感的。另外,findstr函数对字符串矩阵不起作用,因此对字符串矩阵的搜索只能提供循环索引矩阵内的元素实现。
字符串的替换可以通过对字符串数组中对应的元素直接赋值进行实现,也可以使用strrep函数来实现。
例:替换字符串示例
>> String='Peter Piper picked a peck of pickled peppers.';>> String(1:12)='Helen Smith'String =' Helen Smith picked a peck of pickled peppers.'>> String=strrep(String,'Helen Smith','Sabrina Crame')String =' Sabrina Crame picked a peck of pickled peppers.'
提示:直接赋值方法并不能使两个不同长度字符串相互替换,而使用strrep函数可以替换两个任意长度的字符串。与findstr函数类似,strrep函数也对字符串矩阵不起作用。
1.4.4 字符串——数值转换
MATLAB中还提供了大量字符串类型与数值类型之间的转换函数:
例:将数值嵌入字符串示例
>> rad=2.5;area=pi*rad^2;>> String=['A circle of radius' num2str(rad) 'has an area of' num2str(area) '.'];>> disp(String)A circle of radius2.5has an area of19.635.