第五章字符串_第1页
第五章字符串_第2页
第五章字符串_第3页
第五章字符串_第4页
第五章字符串_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章字符串、单元数组和结构体在实际的应用中,出了数组MATLAB还需要用到其他的数据结构,例如字符串、单元数组、结构体等。本章介绍字符串、单元数组、结构体的生成及操作。

在实际的应用中,出了数组MATLAB还需要用到其他的数据结构,例如字符串、单元数组、结构体等。本章介绍字符串、单元数组、结构体的生成及操作。

2/6/202315.1字符串5.1.1字符串的生成MATLAB中的字符串为ASCII值的数值数组,作为字符串表达式进行表示。在MATLAB中,生成字符串的方法:stringname=’thecontentofthestring’1.由单引号’’创建,例如:>>st='helloeveryone'st=helloeveryone5.1.1字符串的生成MATLAB中的字符串为ASCII值的数值数组,作为字符串表达式进行表示。在MATLAB中,生成字符串的方法:stringname=’thecontentofthestring’1.由单引号’’创建,例如:>>st='helloeveryone'st=helloeveryone2/6/20232如果在字符串内部包含单引号,要如何正确处理呢?>>st1='The'MATLABHELP'isagoodreferenceforusingMatlab'???st1='The'MATLABHELP'isagoodreferenceforusingMatlab'Error:Missingoperator,comma,orsemicolon.>>st1='The''MATLABHELP''isagoodreferenceforusingMatlab'st1=The'MATLABHELP'isagoodreferenceforusingMatlab2/6/202332.字符串是一个ASCII码的字符数组,因此,与普通数组一样,字符串也可以形成矩阵(表现为一个字符串有多行)。但是,这些行必须有相同数目的列数。>>st2=['The''MATLABHELP''isagoodreferenceforusingMatlab']st2=The'MATLABHELP'isagoodreferenceforusingMatlab2/6/20234>>st3=['abc''def']st3=abcdef>>st4=['ab''cde']???Errorusing==>vertcatAllrowsinthebracketedexpressionmusthavethesamenumberofcolumns.二维字符数组如何实现呢?这些行必须有相同数目的列数2/6/202353.使用char函数可以创建长度不一致的字符串矩阵。char函数自动将所有字符串的长度设置为输入字符串中长度的最大值。>>st3=char('abc','defgh')st3=abcdefgh>>whosst3NameSizeBytesClassst32x520chararrayGrandtotalis10elementsusing20bytes2/6/20236字符串长度测试函数size()与deblank()函数>>name=char('zhangli','zhouxianlin')name=zhanglizhouxianlin>>size(name)ans=213>>fist=name(1,:),second=name(2,:)fist=zhanglisecond=zhouxianlin>>length1=size(fist),length2=size(second)length1=113length2=113>>z=deblank(name(1,:))z=zhangli>>lengthOfz=size(z)lengthOfz=18deblank函数自动删除char函数添加的空格2/6/202375.1.2字符串的操作

字符串本质是一个元素全部为整数的数值数组,因此可以采用对数组的操作来处理字符串。1.字符串的显示 字符串的显示有两种方式:直接显示和利用disp函数进行显示。>>st3st3=abcdefgh>>disp(st3)abcdefgh2.字符串的执行 在MATLAB中可以用函数eval来执行字符串。2/6/20238eval(str):执行字符串str中的表达式,命令等。>>str=['m=','[1:10]']str=m=[1:10]>>eval(str)m=123456789102/6/20239>>forn=1:3magic_str=['M',int2str(n),'=magic(n)'];...eval(magic_str)endM1=1M2=1342M3=8163574922/6/202310创建中文字符串Matlab可以创建中文字符串,同样一个中文字符也是占一个元素的位置,但是中文的unicode字符值大于256.>>A='今天周三'A=今天周三>>sA=size(A)sA=14>>A34=A([34])A34=周三>>ucA=double(A)ucA=20170228252160819977>>char(ucA)ans=今天周三2/6/2023113.字符串的运算字符串的运算主要包括:判断字符串是否相等通过字符串运算来比较字符串中的字符进行字符分类、查找与替换字符串与数值数组之间的相互转换2/6/202312函数名函数用途函数名函数用途strcat横向连接字符串strvcat纵向连接字符串strcmp字符串比较strncmp比较字符串的前n个字符findstr字符串查找strjust字符串对齐strmatch字符串匹配strrep字符串查找与替换strtok选择字符串中的部分blanks创建由空格组成的字符串deblank删除字符串结尾的空格ischar判断变量是否为字符串iscellstr判断字符串单元数组isletter判断数组是否由字母组成isspace判断是否空格stringsMATLAB字符串句柄2/6/202313>>st1='abcdef'st1=abcdef>>str2='ab'str2=ab>>isequal(st1,str2)ans=0>>st3='ab'st3=ab>>isequal(st3,str2)ans=1>>str1=['matlab'];str2=['Matlab'];>>isequal(str1,str2)ans=0>>str1==str2ans=011111>>str3=['Mat'];>>str3==str2???Errorusing==>==Arraydimensionsmustmatchforbinaryarrayop.>>isequal(str3,str2)ans=02/6/202314(1)字符串的比较字符串的比较主要为比较两个字符串是否相同,字符串中的子串是否相同和字符串中的个别字符是否相同。用于比较字符串的函数主要是strcmp和strncmp。strcmp()函数:功能:用于比较两个字符串是否相同。调用格式:strcmp(str1,str2)返回值:(1)当两个字符串相同时返回1,否则返回0。(2)当所比较的两个字符串是单元字符数组时,返回值为一个列向量,元素为相应行比较的结果。2/6/202315strncmp()功能:用于比较两个字符串的前面n个字符是否相同调用格式:strncmp(str1,str2,n)返回值:(1)当字符串的前n个字符相同时返回1,否则返回0。(2)当所比较的两个字符串时单元数组时,返回值为列向量,元素为相应行比较的结果。2/6/202316>>str1=['matlab'];str2=['Matlab'];str3=['Mat'];>>strcmp(str1,str2)ans=0>>strcmp(str2,str3)ans=0>>strncmp(str2,str3,3)ans=1>>strncmp(str2,str3,4)ans=02/6/202317当两个字符串拥有相同的维数时,可以利用MATLAB运算法则,对字符数组进行比较。字符数组的比较与数值数组的比较基本相同,不同之处在于字符数组比较时进行比较的是字符的ASCII码值。进行比较返回的结果为一个数值向量,元素为对应字符比较的结果。2/6/202318符号符号意义英文简写==等于eq~=不等于ne<小于lt>大于gt<=小于等于le>=大于等于ge2/6/202319>>str1=['matlab'];str2=['Matlab'];>>ge(str1,str2)ans=111111>>le(str1,str2)ans=0111112/6/202320isspace()和isletter()MATLAB可以判断字符串中的字符是否为空格字符或者字母的函数isspace和isletter。isspace:用法为isspace(str),判断字符串str中的字符是否为空格,是空格字符则返回1,否则返回0。isletter:用法为isletter(str),判断字符串str中的字符是否为字母,是字母则返回1,否则返回0。2/6/202321>>name=['abcdef']name=abcdef>>isletter(name)ans=1110111>>isspace(name)ans=00010002/6/202322(2)字符串的查找和替换用于查找的函数主要有findstr,strmatch,strrep,strtok等。findstr:用于在一个字符串中查找子字符串,返回子字符串出现的起始位置。用法为findstr(str1,str2),执行时系统首先判断两个字符串的长短,然后在长的字符串中检索短的子字符串。strrep:查找字符串中的子字符串并将其替换为另一个子字符串。用法为str=strrep(str1,str2,str3),将str1中的所有子字符串str2替换为str3。>>name=[‘abcdef’];>>strrep(name,'abc','ABC')ans=ABCdef2/6/202323>>name=[‘abcdef’];>>str=['abc']str=abc>>findstr(name,str)ans=1>>findstr(name,'def')ans=5>>findstr('def',name)ans=5>>strfind(name,'def')ans=5>>strfind('def',name)ans=[]findstr()可以互换两个字符串的位置,strfind()也可以实现查找字串,但是两个参数不能换位STRFINDFindonestringwithinanother.K=STRFIND(TEXT,PATTERN)returnsthestartingindicesofanyoccurrencesofthestringPATTERNinthestringTEXT.

STRFINDwillalwaysreturn[]ifPATTERNislongerthanTEXT.IfyouwishtosearchforinclusionofeitherTEXTinPATTERNorPATTERNinTEXT,useFINDSTRinstead.

2/6/202324>>name=['matlabmatlabmat']name=matlabmatlabmat>>findstr(name,'m')ans=1713>>findstr('lab',name)ans=410>>strfind('lab',name)ans=[]2/6/202325strmatch:在字符数组(字符矩阵)的每一行中查找是否存在待查找的字符串,存在则返回1,否则返回0。用法为strmatch('str',STRS),查找STRS中以‘str’开头的字符串。另外可以用strmatch('str',STRS,’exact’),查找精确包含str的字符串。strtok:该函数用于选取字符串中的第一个部分。即找出第一个间隔符(空格,制表位,回车符)前的内容。(对字符矩阵不起作用)。该函数的简单用法为strtok(str)。>>strtok(‘thisisanexample’)%字符串ans=this2/6/202326>>strmatch(‘mat’,char(‘mat’,‘matlab’,‘MAT’))%字符矩阵ans=12>>strmatch('mat',char('mat','matlab','MAT'),'exact')ans=1>>strmatch('mat',char('MAT','matlab','MAT'),'exact')ans=Emptymatrix:0-by-1>>strmatch('mat',char('MAT','matlab','MAT'))ans=22/6/202327字符串的排序>>a='andjkdkdkkdjf';>>sort(a)ans=addddfjjkkkkn>>[v,c]=sort(a)v=addddfjjkkkknc=136811134125791022/6/2023285.1.3字符串与数值之间的转化一个字符串是由单引号括起来的简单文本。在字符串中的每个字符都是数组中的一个元素,这些数字是由ASCII字符表示的。这些字符和整数之间可以相互转化。1:字符串转化为数组abs();double()2/6/202329>>name=char('zhangli','fengshan')name=zhanglifengshan>>abs_of_name=abs(name)abs_of_name=1221049711032103108105321021011101033211510497110>>double_of_name=double(name)double_of_name=12210497110321031081053210210111010332115104971102/6/202330>>str='whoamI'str=whoamI>>double(str)ans=11910411132971093273>>number='123.45'number=123.45>>double(number)ans=4950514652532/6/2023312:将数值数组转化为字符串char函数的用法Str=char(arr),该命令将包含正数的数组arr转化为字符数组。当arr是一个字符型单元数组时,Str=char(arr)命令将arr中的每一个单元转化为字符型数组的对应行。使用cellstr可以进行逆变换。Str=char(str1,str2,str3,...),该命令生成的字符串矩阵包含字符串str1、str2和str3,三个字符串的长度可以不相同。2/6/202332>>name=char('zhangli','fengshan')name=zhanglifengshan>>abs_of_name=abs(name)abs_of_name=1221049711032103108105321021011101033211510497110>>char(abs_of_name)ans=zhanglifengshan2/6/202333>>c{1,1}='abc'c='abc'[3x3double]>>c{1,2}=char('matlab','help')c='abc'[2x6char]>>C=char(c)C=abcmatlabhelp>>ce=cellstr(C)ce='abc''matlab''help'>>whosceNameSizeBytesClassAttributesce3x1206cell

>>

whosCNameSizeBytesClassAttributesC3x636char

2/6/202334字符串和数值数组之间的转化(补充)上面已经介绍字符串和数值数组之间可以相互转化,除上面介绍的方法,MTALAB还提供更多的函数,用于字符串和其他数据类型数值数组之间的转化,可以实现更多功能。2/6/202335函数功能备注uintN(如,uint8)将字符串转化为相应的无符号整数uint8('ab')→9798str2num将字符型转化为数字型str2num('123.56')→123.5600str2double与上一函数的功能相同,结果更精确一些,同时支持单元字符串数组double('123.56')→495051465354。hex2num将十六进制数转化为双精度数hex2num('A')→-1.4917e-154hex2dec将十六进制数基数转化为正数hex2dec('B')→11bin2dec将二进制转化为十进制bin2dec('1010')→10base2dec将N底数字字符串转化为十进制base2dec('212',3)→232/6/2023365.2单元数组主要内容:5.2.1单元数组的生成5.2.2单元数组的操作单元数组元素的访问单元数组的显示单元数组的图形显示单元数组元素的删除改变单元数组的维数2/6/2023375.2.1单元数组的生成要在MALTAB中实现比较复杂的编程,就不能不用单元数组(cellarray)和结构数组(structarray)。这两种数据类型均是将不同的相关数据集成到一个单一的变量中。单元数组中的每一个元素称为单元(cell).

单元可以包含任何类型的matlab数据:数值数组,字符,符号对象,甚至其他的单元数组和结构体.不同的单元可以包含不同的数据.MATLAB中的单元数组可以为任意维,通常最常用的是一维和二维单元数组。2/6/202338用户可以通过两种方式创建一个单元数组:1:通过赋值语句直接创建;单元数组用花括号(即{})表示,在赋值时需要将单元内容用花括号括起来。2:利用cell函数先为单元数组分配一个内存空间,然后再给各个单元赋值。2/6/2023391:直接赋值创建单元数组>>c={1,magic(2)}c=[1][2x2double]>>c{2,1}='hello'c=[1][2x2double]'hello'[]>>c{1,3}=char('i','happy')c=[1][2x2double][2x5char]'hello'[][]>>class(c)ans=cell2/6/202340>>A(1,1)={1}A=[1]>>A(1,2)={magic(2)}A=[1][2x2double]>>A(2,1)={'hello'};>>A(1,3)={char('i','happy')}A=[1][2x2double][2x5char]'hello'[][]>>isequal(c,A)ans=12/6/2023412:利用cell函数:>>B=cell(2,3)%首先用cell函数创建一个空的单元数组B=[][][][][][]>>whosBNameSizeBytesClassAttributesB2x324cell>>B(2,1)=A(2,1)%然后再为数组元素赋值B=[][][]'hello'[][]>>B(1,3)=c(1,3)B=[][][2x5char]'hello'[][]2/6/202342>>AB=[AB]AB=

[1][2x2double][2x5char][][][2x5char]

'hello'[][]'hello'[][]>>A_B=[A;B]A_B=

[1][2x2double][2x5char]'hello'[][][][][2x5char]'hello'[][]2/6/2023435.2.2单元数组的操作单元数组元素的访问单元数组的显示单元数组的图形显示单元数组元素的删除改变单元数组的维数2/6/2023441:单元数组元素的访问使用圆括号进行索引;>>A(1,3)%圆括号索引时,表示的是该单元ans=[2x5char]使用花括号对单元数组索引;>>A{1,3}%花括号索引时,表示该单元的内容ans=ihappy2/6/202345>>fori=1:3C(i)={magic(i)};end>>celldisp(C)C{1}=1C{2}=1342C{3}=816357492>>C{1,2}(2,:)%先取得C的单元内容,再访问这个矩阵的第二行元素ans=42>>C{1,3}([1,3],:)%访问C第一行第三个单元中第一列,第三列的元素ans=8164922/6/2023462:显示单元数组在显示单元数组时MATLAB有时只显示单元的大小和数据类型,而不显示每个单元的具体内容。若要显示单元数组的内容,可以用celldisp函数。2/6/202347>>A%只显示单元的大小和数据类型A=[1][2x2double][2x5char]'hello'[][]>>celldisp(A)%显示单元数组的内容A{1,1}=1A{2,1}=helloA{1,2}=1342A{2,2}=[]A{1,3}=ihappyA{2,3}=[]2/6/2023483:单元数组的图形显示MATLAB支持以图形方式(cellplot)查看单元数组的内容。用这种方法可以直观的看出单元数组的结构。但是需要注意的是,cellplot只能用于显示二维单元数组的内容。>>AA=[1][2x2double][2x5char]'hello'[23]{1x1cell}>>cellplot(A)2/6/2023492/6/2023504:单元数组元素的删除

单元数组元素删除的方法:将待删除的元素置为“空”即可。需要注意的是在删除单元数组的元素时,采用的索引方式为一维下标,格式为:A(cell_subscripts)=[]。如果操作的单元数组为多维数组,则其索引方式逐维进行,删除元素后,系统将该单元数组改变为一维单元数组,元素按照维数逐次排序。删除数组元素可以每次删除多个,下标用一维数组指定2/6/202351>>AA=[1][2x2double][2x5char]'hello'[23][1x5double]>>A(2)=[]A=[1][2x2double][23][2x5char][1x5double]>>BB=[][][2x5char]'hello'[][]>>B(2,3)=[]???Anullassignmentcanhaveonlyonenon-colonindex.>>B(2,:)=[]B=[][][2x5char]2/6/202352第53页5:改变单元数组的维数1:可以通过添加或删除数组元素改变数组的维数。删除数组元素时,得到的单元数组为原数组中剩下元素排列而成,为一维数组,如上面一部分所介绍。添加数组元素时,自动添加该数组所对应的行和列,其他元素为空。2:通过函数reshape改变数组的形状。reshape函数按照顺序将原单元数组的元素进行重新放置,得到新的单元数组元素个数与原数组相同。2/6/202353>>C=cell(3)C=[][][][][][][][][]>>C(1,:)=[]C=[][][][][][]>>reshape(C,3,2)ans=[][][][][][]2/6/2023545.3结构体MATLAB的结构体变量和C语言的结构体变量类似,并且比C语言更直观。与单元数组不同的是,结构体有一个名字,结构体的每个成员元素也有自己的名字,访问是通过元素的名字来完成的。主要内容:1:结构体的生成2:结构体的操作添加成员变量删除成员变量调用成员变量2/6/2023555.3.1结构体的生成两种生成方式:直接输入与struct函数1:直接输入>>=‘wangliang’;student.number=‘0012102’;student.age=23;%使用“.”符号>>studentstudent=name:'wangliang'number:'0012102'age:232/6/202356需要扩充结构体数组时,可以通过直接对结构体变量赋值来完成。>>student(2).name=‘zhangli‘%直接为第二个结构体变量赋值student=1x2structarraywithfields:%结构体数组被扩充为1x2namenumberage>>student(2)%显示第二个对象ans=name:'zhangli'number:[]age:[]2/6/2023572:使用结构体生成函数struct()struct函数的最基本的使用方式是:struct_name=struct(‘field1’,V1,‘field2’,V2,...),其中fieldn是各成员变量名,Vn为对应的各成员变量的内容。2/6/202358>>student=struct('name','wangliang','number','0012102','age',23)student=name:'wangliang'number:'0012102'age:232/6/202359一次创建结构体多个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论