广州白云网站建设公司,优秀自适应网站建设哪家好,注册公司需要交多少税,大连建设网水电煤气费查询网MATLAB中的数据类型主要包括数值类型、逻辑类型、字符串、函数句柄、结构体和单元数组类型。这六种基本的数据类型都是按照数组形式存储和操作的。
MATLAB中还有两种用于高级交叉编程的数据类型#xff0c;分别是用户自定义的面向对象的用户类类型和Java类类型。
1.1.1数值类…
MATLAB中的数据类型主要包括数值类型、逻辑类型、字符串、函数句柄、结构体和单元数组类型。这六种基本的数据类型都是按照数组形式存储和操作的。
MATLAB中还有两种用于高级交叉编程的数据类型分别是用户自定义的面向对象的用户类类型和Java类类型。
1.1.1数值类型
基础的数值类型只要有整数、单精度浮点型和双精度浮点型。 MATLAB中数值类型的数据包括有符号和无符号整数、单精度浮点数和双精度浮点数。在未加说明与特殊定义时MATLAB对所有数值按照双精度浮点数类型进行存储和操作。
在需要时。可以指定系统按照整数类型或双精度浮点数类型对指定的数字或数组进行存储、运算等操作。相对于双精度浮点数类型整数类型与单精度浮点数类型的优点在于节省变量占用的内存空间当然要在满足精度要求的前提下。
提示MATLAB会自动进行记忆体的使用和回收而不像C语言必须由使用者一一指定这些功能使得MATLAB易学易用使用者可专心致志于撰写程序。
1.整数类型
MATLAB中提供了8中内置的整数类型这8种整数类型的存储占用位数、能表示的数值范围和转换函数均不同。
不同的整数类型所占用的位数不同因此能够表示的数值范围也不同在实际应用中应根据实际需要合理选择合适的整数类型。
由于MATLAB中数值的默认存储类型是双精度浮点数类型因此将变量设置为整数类型时需要使用相应的转换函数将双精度浮点数转换成指定的整数类型。 在转换过程中MATLAB默认将带转换数值转换为与之最为接近的整数值若小数部分为0.5则转换后的结果为与该浮点数最为接近的两个整数中绝对值较大的一个。
另外这些转换函数也可以将其他数据类型转换为指定的数据类型。在不超过数值范围的情况下任意两个整数类型之间也可以通过转换函数进行相互转换。同时由于不同的整数类型能够表示的数值范围不同因此当运行结果超出对应的整数类型能够表示的范围时就会出现错误运算结果被指为该整数类型能够表示的最大值或最小值。
MATLAB中还包含了几类不同运算法则的取整函数也可以把浮点数转换成整数。这些取整函数及相应的转换形式如下 2.浮点数类型
MATLAB中提供了单精度浮点数类型和双精度浮点数类型其存储位宽、能够表示的数值范围、数值精度各方面均不相同。 由上图可知单精度浮点数类型的占用位数少因此占用内存小能够便是的数值范围和数值的精度都比双精度浮点数类型小。
由于MATLAB中的默认数值类型为双精度浮点数类型因此与创建整数类型数值一样也可以通过转换函数来实现创建单精度浮点数类型。
双精度浮点数在参与运算时返回的类型依赖于参与运算的其他数据类型。当参与运算的其他数据类型为逻辑类型、字符类型时返回结果为双精度浮点数类型当参与运算的其他类型数据为整数类型时返回的结果为相应的整数类型当参与运算的其他数据为单精度浮点数类型时返回结果为对应的单精度浮点数类型。
提示在MATLAB中单精度浮点数类型不能与整数类型进行算术运算。
例浮点数参与的运算
输入
auint32(120);bsingle(22.809)c73.226
aba*b
结果
错误使用 *整数只能与同类的整数或双精度标量值组合使用。
输入
aca*c
结果
ac uint328787bcb*cbc single1.6702e03
输入
strhello
结果
str hello
输入
newstrstr-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表示。
例无穷量及非数值量的产生和性质
输入
a0/0,blog(0),cinf-inf
结果
a NaNb -Infc NaN
1.1.2逻辑类型
逻辑类型的数据就是指布尔类型的数据及数据之间的逻辑关系。除了传统的数学运算MATLAB还支持关系和逻辑运算。这些运算的目的是提供求解真/假命题的答案。
作为所有关系个逻辑表达式的输入MATLAB把任何非零数值当作真把零当作假。所有关系和逻辑表达式的输出对于真输出为1对于假输出为0.
逻辑类型数据在进行运算时需要用到关系操作符和逻辑运算符。 MATLAB中的关系操作符能用来比较两个同样大小的数组或用来比较一个数组和一个标量。在后一种情况中标量和数组中的每一个元素相比较结果与数组大小一样。 A1:9,B10-AA 1 2 3 4 5 6 7 8 9B 9 8 7 6 5 4 3 2 1 TrueorFalse(AB) %判断A与B中的元素是否相等TrueorFalse 1×9 logical 数组0 0 0 0 1 0 0 0 0
提示“”和“”在MATLAB中的意义是不同的。“”是对等号两边的变量进行比较当它们相等时返回1不相等时返回0而“”则被用来将运算的结果赋给一个变量。
逻辑运算符提供了一种组合或否定关系表达式 例判断两个数组中的元素是否相等。 A1:9; TrueorFalse(A2)(A6) %判断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表达。 StringEvery good boy does fun.; Uabs(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
输入 UU0U 列 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中所有可利用的数组操作工具进行操作。
例字符串数组的索引示例 StringEvery good boy does fun;UString(7:10)
U
goodUString(10:-1:7)
U doog
在上例中字符串像数组一样进行编址。这里元素710包含单词good。
字符串的单引号是由两个连续的单引号来表示的。
例字符串中的单引号。
输入 StringIts not the manual!String Its not the manual!
字符串的连接可以通过直接将字符串数组连接来实现。
例字符串的连接。 UHello;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_Handlecos就创建了MATLAB内部函数cos的句柄并将其保存在F_Handle变量中在后续的运算过程中就可以通过F_Handle(x)来实现cos(x)的功能。
在通过函数句柄调用函数时也需要指定函数的输入参数。例如可以通过F_Handle(arg1,arg2,…,argn)这样的调用格式来调用具有多个输入参数的函数。
对于那些没有输入参数的函数在使用句柄调用时在句柄变量之后的圆括号中不填写变量名即可即F_Handle()。
例函数句柄的创建与调用。 F_HandlecosF_Handle 包含以下值的 function_handle:cos
输入 x0: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_HandleexpF_Handle 包含以下值的 function_handle:exp
输入 F_HandleblogF_Handleb 包含以下值的 function_handle:log
输入 functions(F_Handle)ans 包含以下字段的 struct:function: exptype: simplefile:
输入 isa(F_Handle,function_handle)%判断F_Handle是否为函数句柄ans logical1
输入 isequal(F_Handle,F_Handleb)%判断两个函数句柄是否对应一个函数ans logical0
1.1.5结构体类型
MATLAB中的结构体与C语言中的结构体类似一个结构体可以通过字段存储多个不同类型的数据。因此结构体相当于一个数据容器把多个相关联的不同类型的数据封装在一个结构体对象中。
一个结构体中可以有多个字段每个字段又可以存储不同类型的数据通过这种方式就把多个不同类型的数据组织在一个结构体对象中。
创建结构体对象的方法有两种可以直接通过赋值语句给结构体的字段赋值也可以使用结构体创建函数struct。两种方法的具体操作步骤如下
1.通过字段赋值创建结构体变量。在对结构体字段进行赋值时赋值表达式的变量名使用“结构体名称.字段名称”形式书写对同一个结构体可以进行多个字段赋值。
例通过字段赋值创建结构体。 Student.NameSam; Student.Grade6; Student.Subject{Chinese,Math,English}; Student.Rusult{99,99,99}; StudentStudent 包含以下字段的 struct:Name: SamGrade: 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函数的句法形式为 StrArraystruct{field1,var1,field2,var2,...,fieldn,varn}
上述语句可以创建结构体对象StrArray并将其n个字段分别赋值为var1var2…,varn。
例利用struct函数创建结构体。 Schedule(2)struct(Day,Thursday,Time,15:00,Number,18)Schedule 包含以下字段的 1×2 struct 数组:DayTimeNumber
输入 Schedule(1)%结构体第一个元素没有赋值因此所有字段均为空数组ans 包含以下字段的 struct:Day: []Time: []Number: []
输入 ScheduleArrayrepmat(struct(Day,Thursday,Time,15:00,Number,18),1,2)ScheduleArray 包含以下字段的 1×2 struct 数组:DayTimeNumber
输入 ScheduleArray(1)%1×2的结构体数组的两个元素完全相同ans 包含以下字段的 struct:Day: ThursdayTime: 15:00Number: 18
输入 ScheduleArray(2)ans 包含以下字段的 struct:Day: ThursdayTime: 15:00Number: 18
输入 newArraystruct(Day,{Thursday,Friday},Time,{15:00,9:00},Number,{18,6})newArray 包含以下字段的 1×2 struct 数组:DayTimeNumber
输入 newArray(1)ans 包含以下字段的 struct:Day: ThursdayTime: 15:00Number: 18
输入 newArray(2)ans 包含以下字段的 struct:Day: FridayTime: 9:00Number: 6
1.1.6数组类型
在MATLAB中进行运算的所有数据类型都是按照数据及矩阵的形式进行存储和运算的二者在MATLAB中的基本运算性质不同数组强调元素对元素的运算而矩阵则采用线性代数的运算方式。
数组的属性及数组之间的逻辑关系是编写程序时非常重要的两个方面。在MATLAB平台中数组的定义是广义的数组的元素可以是任意数据类型例如可以是数值、字符串、指针等。
利用数组的构建方法可以直接对变量进行赋值。
例对变量赋值创建数组。 Array[1 2 3 4 5 6]Array 1 2 3 4 5 6
在MATLAB中可以使用冒号“”来代表一系列数值有时也使用它来定义数组。其句法格式如下 Arrayi:k
创建从i开始、步长1、到k结束的数字序列即i,i1,i2,…,k。如果ikMATLAB则返回一个空矩阵。数字i和k不必是整数该序列的最后一个数小于或等于k。 Arrayi:j:k
创建从i开始、步长为1、到k结束的数字序列即i,ij,i2j,…,k.如果j0则返回一个空矩阵数字i、j和k不必是整数该序列的最后一个数小于等于k。
还有一些预定义函数与可以用来创建线性序列和逻辑序列。
Arraylinspace(a,b,100)
在区间[a,b]上创建一个有100个元素的向量这100个数把整个区间线性分割。
Arraylinspace(a,b,n)
在区间[a,b]上创建一个有n个元素的向量。这个命令和冒号表示形式相近但是它直接定义了数据的个数。
例创建等差数列。 Array_a0:5,Array_blinspace(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函数的调用格式如下 cellNamecell(m,n)
该函数创建一个m×n的空单元数组其每一个单元均为空矩阵。
例创建空单元数组 clear acell(2,2); bcell(1); whosName Size Bytes Class Attributesa 2x2 32 cell b 1x1 8 cell
同一般的数值数组一样单元数组的内存空间也是动态分配的。因此使用cell函数创建空单元数组的主要目的是为该单元数组预先分配连续的存储空间以节约内存占用提高执行效率。
2.单元数组的寻访
在单元数组中单元和单元中的内容是两个不同范畴的东西因此寻访单元和单元中的内容是两种不同的操作。MATLAB为上述两种操作设计了相应的操作对象单元外标识和单元内编址。
对于单元数组CC(m,n)指的是单元数组中第m行第n列的单元而C{m,n}指的是单元数组中第m行第n列单元中的内容。
例单元数组的寻访 C{3,[4 7;6 6;80 9],string;sin(pi/8),310,code}C 2×3 cell 数组{[ 3]} {3×2 double} {string}{[0.3827]} {[ 0]} {code } unirVal_1C(2,2)unirVal_1 1×1 cell 数组{[0]} class(unirVal_1)ans cell unitVal_2C{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函数的调用格式为
trimcreshape(C,M,N)
该函数将单元数组C改为一个具有M行N列的新单元数组。
例将上题中的单元数组C1×4改为newC4×1。 newCreshape(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元素进行寻访的索引称为“键”。一个键可以是以下任何一种数据类型
11×N字符串。
2单精度或双精度实数标量。
3有符号或无符号标量整数
这些键和其对应的数据存储在map中一个map的每一个条目都包括唯一的键和相对应的数据。map中存储的数据可以是任何类型的包括数值类型、字符或字符串类型、结构体类型、单元类型或者其他map。
一个map是MATLAB类的一个对象。map类的所有对象具有三个属性。用户不能直接对这些属性进行修改但可以通过作用于map类的函数进行修改。 map类的属性的查看方法为map名.小数点“.”map属性名。例如为了查看mapW对象包括的数据类型需要使用mapW.ValueType。
2.创建map对象
map是一个map类中的对象由MATLAB中名为“容器”的一个包来定义可以通过构造函数来创建其创建方法如下
mapObjcontainers.Map({key1,key2,...},{val1,val2,...})
当键和值是字符串时需要对上述语法稍作变更即
mapObjcontainers.Map({key1,key2,...},{val1,val2,...})
例创建一个名为schedulemap的map对象来存储课表。
创建过程如下 schedulemapcontainers.Map({Monday,Tuesday,Wendesday,Thursday,Friday},{Maths,Chinese,History,Geography,Biology})schedulemap Map - 属性:Count: 5KeyType: charValueType: char
此外map对象的创建可以分为两个步骤首先创建一个空的map对象然后使用keys和values方法对其内容进行补充。空map对象创建方法如下 newMapcontainers.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对象后用户可以对其进行数据的访问。寻访指定键所对应的值使用的格式如下
valueNamemapName(keyName)
当键名是一个字符串时需使用但括号将键名括起来。
例通过使用键名访问schedulemap对象的内容 courseschedulemap(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对象中的“星期四“及其对应的科目。 newMapcontainers.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 courseschedulemap 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个数aiji1,2,…,m;j1,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.建立特殊矩阵
特殊矩阵是指非零元素或零元素的分布有一定规律的矩阵常见的特殊矩阵有对称矩阵、三角矩阵和对角矩阵。
例特殊矩阵构造示例
OnesMatrixones(2),ZerosMAtrixzeros(2),Indetityeye(2)...Indentuty23eye(2,3),Indenytity32eye(3,2)OnesMatrixones(2),ZerosMAtrixzeros(2),Indetityeye(2),Indentuty23eye(2,3),Indenytity32eye(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
输入Randomrand(2,3),ArrayRandom(:,3),Diagelementdiag(Random),Diagmatrixdiag(diag(Random)),Dmatrix_arraydiag(Array),UpperTriangulartriu(Random),LowerTriangulartril(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.向量
当m1或n1即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.标量
当n1m时建立的矩阵成为标量。任意以1×1的矩阵形式表示的单个实数、复数都是标量。 x102i%将复数102i赋值给变量xx 10.0000 2.0000i shapesize(x)%查询变量x的形状信息shape 1 1 y[102i]%将复数102i构成的矩阵赋值给变量yy 10.0000 2.0000i shapesize(y)%查询变量y的形状信息shape 1 1 xy%判断变量x和y是否相等ans logical1
通过上述示例可知单个实数或复数在MATLAB中都是以矩阵的形式存储的在MATLAB中单个数据或由单个数据构成的矩阵都是标量
3.空矩阵
当mn0时或者m0或者n0即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的矩阵A7表示矩阵A中地行第2列的元素而A(13)表示矩阵A中第一行第4列的元素。
1.矩阵下标访问单个矩阵元素
常用的矩阵索引表达式如下图 例矩阵下标引用示例 Matrixmagic(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 SubmatrixMatrix(2:3,3:6)Submatrix 7 21 23 252 22 27 20 ArrayMatrix([7:10 26:31])Array 1 32 9 28 23 27 10 14 18 24
2.线性引用矩阵元素
矩阵中某一元素的单下标索引值和双下标索引值之间可以提供MATLAB内部函数进行转换其句法形式
INDsub2ind(siz,i,j)
其功能为将双下标索引值转换为单下标索引值其中siz是一个包含两个元素的数组代表了转换矩阵的行列数一般可以直接用siz(A)表示i与j分别表示双下标索引中的行、列值IND是转换后的单下标索引。
[I,J]ind2sub(size,ind)
其功能是将单下标索引值转换为双下标索引值各变量意义同上。
例矩阵元素单双下标索引值转换示例 Matrixmagic(3); INDsub2ind(size(Matrix),2,3); [I J]ind2sub(size(Matrix),7)IND 8I 1J 3
3.访问多个矩阵元素
设Amagic(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))
实际上还可以用冒号来表示非相邻的多个元素 A1:10; BA(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的数据结构。 Azeros(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的维数信息。 Aeye(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 dsize(A)d 5 3 e1size(A,1)e1 5 e2size(A,2)e2 3
由上述size函数的应用可知①size函数的返回值可以是分开显示的单个实数变量也可以是一个行变量②在size函数的输入参数中增加维度参数可以获取指定维度的长度其中“1”代表行“2”表示列。
使用numel函数numel是number of elements的简写可以获取矩阵A中元素的个数。 fnumel(A)f 15
例数值与矩阵的算术运算示例。 A[];B1:4;C[1:4;5:8]; S1size(A)S1 0 0 S2size(B)S2 1 4 S3length(B)S3 4 S4size(C)S4 2 4 S5length(C)S5 4 S6numel(C)S6 8
3.矩阵维度
对于空矩阵、标量矩阵、一维数组和二维矩阵MATLAB都将其作为普通二维数组对待。特别需要注意的是用[]产生的空矩阵作为二维矩阵的但是在高维矩阵中也有空矩阵的概念此时空矩阵则具有多个维度。
MATLAB中提供了ndims函数计算矩阵维度
例计算矩阵维度示例 A[];B5;C1:3;Dmagic(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 数组MATLABcourse isstruct(B)ans logical0 ischar(B)ans logical1
例矩阵的数据类型示例 Matmagic(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 42i];%定义一个具有实数和复数的矩阵 real_array[];%定义存储实数和复数的矩阵目前为空矩阵 complex_array[]; for i1:length(A),if isreal(A(i))1,%判断矩阵元素是否为实数real_array[real_Array A(i)];elsecomplex_array[complex_array A(i)];end;end; for i1: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命令查看当前工作区中指定变量的所以信息包括变量名、矩阵大小、内存占用情况和数据类型等。
例查看矩阵占用的内存示例 Matrixrand(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并访问其中的元素。 Arand(4,3)A 0.8147 0.6324 0.95750.9058 0.0975 0.96490.1270 0.2785 0.15760.9134 0.5469 0.9706 xA(2,2)x 0.0975 yA(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的01正太分布随机矩阵X并进行访问。 Xrandn(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 AX(2,:)A -0.0631 1.6302 -0.8095 0.3129 -1.1135 1.1006 0.8886 1.5877 BX(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)*m1)
例线性寻址示例
建立3阶希尔伯特矩阵A并进行线性寻址访问。 Ahilb(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并进行赋值操作。 Mmagic(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分别分别取DIM1和DIM2。 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]; MAB1cat(1,A,B)%将矩阵A、B按行合并MAB1 2 0 -11 3 21 7 -14 2 32 0 1
如果合并错误如 MAB2cat(2,A,B)%将矩阵A、B按列合并错误使用 cat要串联的数组的维度不一致。 MAC1cat(1,A,C)%将矩阵A、C按行合并错误使用 cat要串联的数组的维度不一致。使用cat函数对矩阵A、C进行合并成操作 MAC2cat(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]; Yblkdiag(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中的算术运算符有加、减、乘、除、点乘、点除等其运算法则如下 例数值与矩阵的算术运算示例 Aeye(2),Bones(2),CA*B,DA.*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比较结果为假。
例关系运算符的运用 A1:9,B10-AA 1 2 3 4 5 6 7 8 9B 9 8 7 6 5 4 3 2 1 TrueorFalse(A4)TrueorFalse 1×9 logical 数组0 0 0 0 1 1 1 1 1
例关系运算符的运算 C5:-1:0;CC(C0)*epsC 5.0000 4.0000 3.0000 2.0000 1.0000 0.0000
提示上述中利用特殊的MATLAB数eps代替一个数组中的零元素eps接近于2.2e-16.这种特殊的表达式子啊避免0作为分母时是很有用的。
1.3.3逻辑运算符
逻辑预算符提供了一种组合或否定关系表达式。MATLAB中的逻辑运算符如下图 例逻辑运算符的运用 A1:9A 1 2 3 4 5 6 7 8 9 TrueorFalse~(A4)TrueorFalse 1×9 logical 数组1 1 1 1 0 0 0 0 0 TrueorFalse(A2)(A6)TrueorFalse 1×9 logical 数组0 0 1 1 1 0 0 0 0
与关系运算符一样逻辑运算符也可以进行矩阵与数值之间的比较比较方式为将矩阵的每一个元素都与数值进行比较比较结果为一个相同维数的矩阵新生成矩阵中的每一个元素都代表着原来矩阵相同位置上的元素与该数值的逻辑运算结果。
在使用逻辑运算符比较两个相同维数的矩阵时是按元素来进行比较的其结果是一个包含0和1的矩阵。元素0表示逻辑为假元素为1表示逻辑为真。
AB返回一个与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_aHow are you?,Str_bI dontt know,Str_cstrcat(Str_a,Str_b)Str_a How are you?Str_b I dontt knowStr_c How are you?I dontt know Str_mat[July;August;September;]错误使用 vertcat要串联的数组的维度不一致。 Str_mat1[U r a man.;Im a pen.]Str_mat1 2×10 char 数组U r a man.Im a pen. Str_mat2{July;August;September;}Str_mat2 3×1 cell 数组{July }{August }{September}
MATLAB还提供了stvcat和char函数用于纵向连接多个字符串。在使用strvcat函数连接多行字符串时每行字符串的长度不要求相等所有非最长字符串的右边会自动步长空格使得每行字符串的长度相等。char函数与strvcat函数类似不过当多行字符串中有空字符串时strvcat函数会自动进行忽略而char函数会把空字符串也有空格补偿后再进行连接。
例构造字符串示例 Atop;B;CBottom; sABCstrvcat(A,B,C),cABCchar(A,B,C),size[size(sABC);size(cABC)]sABC 2×6 char 数组top BottomcABC 3×6 char 数组top Bottomsize 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 Cstrcmp( Hello , World )C logical0 Dstrcmp( 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函数来实现。
例替换字符串示例 StringPeter Piper picked a peck of pickled peppers.; String(1:12)Helen SmithString Helen Smith picked a peck of pickled peppers. Stringstrrep(String,Helen Smith,Sabrina Crame)String Sabrina Crame picked a peck of pickled peppers. 提示直接赋值方法并不能使两个不同长度字符串相互替换而使用strrep函数可以替换两个任意长度的字符串。与findstr函数类似strrep函数也对字符串矩阵不起作用。 1.4.4 字符串——数值转换
MATLAB中还提供了大量字符串类型与数值类型之间的转换函数 例将数值嵌入字符串示例 rad2.5;areapi*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.