China-bub.coM 下载 第5章 字符串和其他数据类型 在MATLAB中可能会遇到对字符和字符串的操作。字符串能够显示在屏幕上,也可以用 来构成一些命令,这些命令在其他的命令中用于求值或者被执行。细胞矩阵或者细胞数组是 无类型矩阵,它们中的元素可以是任何类型。MATLAB中还有大量适合于位运算的函数和一 些常用的整数函数。还有可能把向量作为集合来看待。 5.1字符串 一个字符串是存储在一个行向量中的文本,这个行向量中的每一个元素代表一个字符。 实际上,元素中存放的是字符的内部代码,也就是ASCⅡ码。当在屏幕上显示字符变量的值时, 显示出来的是文本,而不是ASCI数字。由于字符串是以向量的形式来存储的,所以可以通过 它的下标对字符串中的任何一个元素进行访问。 字符矩阵也可以这样,但是它的每行字符数必须相同。 5.1.1分配 MATLAB中的字符串用单引号来定义: Nameofvariable='text' 这里的tex可以是字母、数字和特殊字符。 ■例5.1 (a)简单的分配方法,如name=‘灯ohn Smith在屏幕上就会有如下显示: name John Smith (b)如果刚输入‘John Smith那么就将这个字符串赋给变量ams: ans John Smith (c)分配一个字符。如果(a)中变量name已存在,令name(3)=‘a',则会给出: name Joan Smith (d)将上例中的字符串name的元素前后互换位置,可以输入: for i length(name):-1:1 eman(i)=name(length(name)+1-i); end eman 下面显示出字符串eman的值: eman htimS naoJ
下载 第5章 字符串和其他数据类型 在M AT L A B中可能会遇到对字符和字符串的操作。字符串能够显示在屏幕上,也可以用 来构成一些命令,这些命令在其他的命令中用于求值或者被执行。细胞矩阵或者细胞数组是 无类型矩阵,它们中的元素可以是任何类型。 M AT L A B中还有大量适合于位运算的函数和一 些常用的整数函数。还有可能把向量作为集合来看待。 5.1 字符串 一个字符串是存储在一个行向量中的文本,这个行向量中的每一个元素代表一个字符。 实际上,元素中存放的是字符的内部代码,也就是A S C I I码。当在屏幕上显示字符变量的值时, 显示出来的是文本,而不是 A S C I I数字。由于字符串是以向量的形式来存储的,所以可以通过 它的下标对字符串中的任何一个元素进行访问。 字符矩阵也可以这样,但是它的每行字符数必须相同。 5.1.1 分配 M AT L A B中的字符串用单引号来定义: N a m e O f V a r i a b l e =‘t e x t’ 这里的‘ t e x t ’ 可以是字母、数字和特殊字符。 ■ 例5 . 1 (a) 简单的分配方法,如n a m e =‘John Smith’,在屏幕上就会有如下显示: ( b )如果刚输入‘John Smith’,那么就将这个字符串赋给变量 a n s: (c) 分配一个字符。如果( a )中变量n a m e已存在,令n a m e ( 3 )= ‘a’,则会给出: (d) 将上例中的字符串n a m e的元素前后互换位置,可以输入: 下面显示出字符串e m a n的值:
66 China-bub.com MATLAB5手册 下载 关于循环or-loops语句可参考12.2节。用eman=fliplr(name)也可得到同样的结果:见4.1节。 (e)一个字符串的长度:namelen=size(name),给出: namelen 110 ()在字符串中用两个单引号来表示一个单引号: whoscat='Joan"s cat' 显示结果为: whoscat= Joan's cat (g)字符串的组成可以象数字矩阵一样: name1 ='Joan';name2 ='John';heart ='is in love with';... sentence=[name1,’’,heart,’’,name2] 显示的结果为: sentence Joan is in love with John 也可参见命令集47中的命令strcat和strvcat。 ()冒号表达式的使用和在数字矩阵中的使用情况一样: name='Charles Johnsanfirstname=name(l:7喻出: firstname= Charles ()text1=John':text2=‘Joan':couple=[text1;tex给删: couple John Joan ■ 5.1.2字符串命令 有一些命令可用于把字符串转换成其他的表示形式。 命令集45 转换字符串 abs(str) 返回一个向量,其元素是字符串str中字符的ASCI码值。 char(x) 根据指定的字符集将向量x中的整数转换成字符。这 个命令是命令abs的逆操作。在I旧版MATLAB中命令 setstr还可用,但将会被去掉。 num2str(f) 将数值转换成浮点格式的字符串。如果需要,可包含 四位数字和指数。这个命令经常和命令disp、 x1abe1还有一些其他输出命令一起使用:见13.3节 例13.9。 num2str(f,k) 将数值转换成带有k位数字的浮点格式的字符串。 num2str(f,format) 将数值f转换成由formati设定格式的字符串,format用
关于循环f o r- l o o p s语句可参考1 2 . 2节。用e m a n = f l i p l r ( n a m e )也可得到同样的结果;见4 . 1节。 (e) 一个字符串的长度:n a m e l e n = s i z e ( n a m e ),给出: (f) 在字符串中用两个单引号来表示一个单引号: whoscat='Joan"s cat' 显示结果为: w h o s c a t= Joan's cat (g) 字符串的组成可以象数字矩阵一样: 显示的结果为: 也可参见命令集4 7中的命令s t r c a t和s t r v c a t。 (h) 冒号表达式的使用和在数字矩阵中的使用情况一样: name='Charles Johnson' ;firstname= name(1:7) 给出: f i r s t n a m e = C h a r l e s (i) t e x t 1 =‘J o h n’;t e x t 2 =‘J o a n’;couple=[text1; text2] 给出: 5.1.2 字符串命令 有一些命令可用于把字符串转换成其他的表示形式。 命令集4 5 转换字符串 a b s ( s t r ) 返回一个向量,其元素是字符串s t r中字符的A S C I I码值。 c h a r ( x ) 根据指定的字符集将向量 x中的整数转换成字符。这 个命令是命令a b s的逆操作。在旧版 M AT L A B中命令 s e t s t r还可用,但将会被去掉。 n u m 2 s t r ( f ) 将数值f转换成浮点格式的字符串。如果需要,可包含 四位数字和指数。这个命令经常和命令 d i s p 、 x l a b e l还有一些其他输出命令一起使用;见 1 3 . 3节 例1 3 . 9。 n u m 2 s t r ( f , k ) 将数值f转换成带有k位数字的浮点格式的字符串。 n u m 2 s t r ( f , f o r m a t ) 将数值f转换成由f o r m a t设定格式的字符串,f o r m a t用 6 6 M ATLAB 5 手册 下载 ■
China-pub.coM 第5章字符串和其他数据类型 下载 在函数sprintf中,见下面的命令。 int2str(n) 将整数n转换成整数字符串表达式。 rats(x,strlen) 将浮点小数x转换成含有对x的有理逼近的字符串,整 数strlen是每个元素的字符串长度,缺省值为l3。 hex2num(hstr) 将字符申str中的十六进制数转换成相应浮点E正双精度。 hex2dec(hstr) 将字符串hstr中的十六进制数转换成相应整数。 dec2hex(n) 将整数转换成相应的十六进制数字符串。 base2dec(str,base) 将字符串str中从基数base开始的元素转换成十进制数。 dec2base(n,base) 将整数n转换成基数base。 bin2dec(str) 将字符串中的二进制数转换成十进制数。 dec2bin(n) 将整数n转换成二进制数。 mat2str(A,n) 将矩阵A转换成字符串。如果给出了n值,它就代表正 确数字的个数。 str2num(str) 返回字符串sr的数字形式,字符串可以包含数字、小 数点,开始的符号表示10的幂的e,还有复数虚部的i。 str2rng(str) 将一个电子表区域str转换成[R1C1R2C2]形式的向 量,它给出了字符串str中指定区域的开始和最后的行 和列来规定电子表中的区域。 strjust(str) 返回一个和str一样内容的字符串,但是调整了右边。 sprintf(formatstr,A) 将矩阵A中元素返回到一个格式化字符串中,这个格式 是由格式字符串formatstr来定义的,和C语言中的格式控 制相似。这个命令和命令fprintf的作用是一样的,只 是返回的结果是一个字符串而不是一个文件,见5.4节。 [str,E]= 返回一个上述的字符串和矩阵E。如果发生错误,E中 sprintf (...... 就会得到一个错误信息字符串:如果变换正确,就返 回空矩阵E。 sscanf(str, 返回一个矩阵,它是根据字符串formatstr从字符串str formatstr,mn) 中读出数据而构成的矩阵。读出元素的最大个数为m, 但是这个参数是可选的。这个命令和命令fscanf的作 用是一样的,区别在于前者是对一个字符串而不是对 文件进行操作,见15.4节。 [A,nm,E,next]= 得到一个象通过命令sscanf返回的一样的矩阵A,也 sscanf(str, 返回正确转换的元素m的个数以及矩阵E中的错误的 formatstr,mn) 个数。当所有的元素都没有读取时,通过数值next来 指定下个元素。 ■例5.2 假设这些变量已被定义为:str=‘ABC':f1oat=1.25:
在函数s p r i n t f中,见下面的命令。 i n t 2 s t r ( n ) 将整数n转换成整数字符串表达式。 r a t s ( x , s t r l e n ) 将浮点小数x转换成含有对 x的有理逼近的字符串,整 数s t r l e n是每个元素的字符串长度,缺省值为 1 3。 h e x 2 n u m ( h s t r ) 将字符串h s t r中的十六进制数转换成相应浮点数( I E E E双精度)。 h e x 2 d e c ( h s t r ) 将字符串h s t r中的十六进制数转换成相应整数。 d e c 2 h e x ( n ) 将整数n转换成相应的十六进制数字符串。 b a s e 2 d e c ( s t r , b a s e ) 将字符串s t r中从基数b a s e开始的元素转换成十进制数。 d e c 2 b a s e ( n , b a s e ) 将整数n转换成基数b a s e。 b i n 2 d e c ( s t r ) 将字符串中的二进制数转换成十进制数。 d e c 2 b i n ( n ) 将整数n转换成二进制数。 m a t 2 s t r ( A , n ) 将矩阵A转换成字符串。如果给出了 n值,它就代表正 确数字的个数。 s t r 2 n u m ( s t r ) 返回字符串s t r的数字形式,字符串可以包含数字、小 数点,开始的符号表示1 0的幂的e,还有复数虚部的i。 s t r 2 r n g ( s t r ) 将一个电子表区域 s t r转换成[R1 C1 R2 C2 ]形式的向 量,它给出了字符串s t r中指定区域的开始和最后的行 和列来规定电子表中的区域。 s t r j u s t ( s t r ) 返回一个和s t r一样内容的字符串,但是调整了右边。 s p r i n t f ( f o r m a t s t r , A ) 将矩阵A中元素返回到一个格式化字符串中,这个格式 是由格式字符串f o r m a t s t r来定义的,和C语言中的格式控 制相似。这个命令和命令f p r i n t f的作用是一样的,只 是返回的结果是一个字符串而不是一个文件,见1 5 . 4节。 [ S t r , E ] = 返回一个上述的字符串和矩阵 E。如果发生错误,E中 s p r i n t f ( . . . . . . ) 就会得到一个错误信息字符串;如果变换正确,就返 回空矩阵E。 s s c a n f ( s t r , 返回一个矩阵,它是根据字符串f o r m a t s t r从字符串s t r f o r m a t s t r , m n ) 中读出数据而构成的矩阵。读出元素的最大个数为m n, 但是这个参数是可选的。这个命令和命令 f s c a n f的作 用是一样的,区别在于前者是对一个字符串而不是对 文件进行操作,见1 5 . 4节。 [A, nm, E, next]= 得到一个象通过命令s s c a n f返回的一样的矩阵A,也 s s c a n f ( s t r , 返回正确转换的元素m n的个数以及矩阵E中的错误的 f o r m a t s t r , m n ) 个数。当所有的元素都没有读取时,通过数值 n e x t来 指定下个元素。 ■ 例5 . 2 假设这些变量已被定义为: s t r =‘A B C’;f l o a t = 1 . 2 5; 第5章 字符串和其他数据类型 6 7 下载
68 MATLAB5手册 China-bub.com 下载 (a)执行命令x=abs(str),将返回: X 65 66 67 这是字符A、B、C的ASCII码。 (b)如果输入number=hex2dec(str),MATLAB将会给出: number 2748 (c)命令: numstr num2str(float) disp(['Number as a string =',numstr,'!']); 结果为: numstr 1.25 Number as a string 1.25! 为了显示变量numstr,实际上它是一个字符串,可以输入char=numstr(4), MATLAB就会给出: char= 5 通过命令ischar(numstr)和whos,也可知道numstr:是一个字符串。 (d命令numinfo=sprintf(The number%5.2e',float给出: numinfo The number 1.25e+00 (e)命令rationa1=rats(0.979796)将会给出一个包含浮点小0.979796有理逼近的字符串: rational 4995/5098 在命令1itt1eRat=rats(0.979796,5)中的可选数字5将严格限定字符串的长度为5。 littleRat 48/49 ■ 命令rat在本书2.4节中定义。 ■例5.3 假设矩阵A被定义为: A-(34) 命令mat2str(A)给出: ans [113;247] 假设x=4.12345,命令mat2str(A)给出:
(a) 执行命令x = a b s ( s t r ),将返回: 这是字符A、B、C的A S C I I码。 (b) 如果输入n u m b e r = h e x 2 d e c ( s t r ),M AT L A B将会给出: (c) 命令: 结果为: 为了显示变量 n u m s t r,实际上它是一个字符串,可以输入 c h a r = n u m s t r ( 4 ), M AT L A B就会给出: c h a r = 5 通过命令i s c h a r ( n u m s t r )和w h o s,也可知道n u m s t r是一个字符串。 (d) 命令n u m i n f o = s p r i n t f (‘The number=%5 . 2 e’, float)给出: (e) 命令r a t i o n a l = r a t s ( 0 . 9 7 9 7 9 6 )将会给出一个包含浮点小数0 . 9 7 9 7 9 6有理逼近的字符串: 在命令l i t t l e R a t = r a t s ( 0 . 9 7 9 7 9 6 , 5 )中的可选数字5将严格限定字符串的长度为5。 命令r a t在本书2 . 4节中定义。 ■ 例5 . 3 假设矩阵A被定义为: 命令m a t 2 s t r ( A )给出: 假设x = 4 . 1 2 3 4 5,命令m a t 2 s t r ( A )给出: 6 8 M ATLAB 5 手册 下载 ■
China-pub.coM 第5章字符串和其他数据类型 下载 an8▣ 4.12345 num2str(x,2) ans 4.1 ■ 还有对字符串操作的逻辑函数和生成子串的函数。在下面的命令集6中假设sr是一个字符串。 命令集46 字符串函数(一) blanks(n) 返回有n个空格的字符串。 deblank(str) 返回没有后续空格的字符串str。 lower(str) 将str中所有字母转换为小写字母。 upper(str) 将str中所有字母转换为大写字母。 ischar(s) 如果s是字符数据类型,则返回1:否则返回0。在 旧版中该命令还可以使用,但是在将来的高版本中 将会被去掉。 isletter(str(i)) 如果sr中的第个字符是字母,则返回1。 isspace(str) 返回一个和str大小相同的向量。如果在str中的字 符是空格、制表符或者换行符,则向量的相应位置 的元素为1:否则为0。 strcmp(str1,str2) 比较串str1和串str2,如果相等返回1:否则返回0。 stricmp(strl,str2) 和stremp一样,但是在比较时不区分大小写。 str2mat (strl,str2,...) 用stl、st2等创建字符串矩阵。如果字符串tr的大小不 同,MATLAB自动在较短的字符串后添加空格。函数最 多可以带个参数,但是它们本身也可以是字符串矩阵。 findstr(strl,str2) 返回一个向量,它包含str1中子串str2的起始位置。 strrep(strl,str2,str3) 在字符串str1中含有str2的所有位置用str3来代替。 strtok(strl,str2) 返回在str1中含有str2的第一个标记前所有的str1的 部分。如果str2没有指定,MATLAB使用空格,那 么就找出str1中不含有空格的第一个序列。 [outstr,rstr]=strtok 字符串outstr等于strtok(str1,str2)返回值, 字符串rstr (str1,str2) 等于字符串str1余下的部分。 lasterr 返回上一个错误信息的字符串。 lastwarn 返回上一个警告信息的字符串。 ■例5.4 (a)name=upper(matlab')给出:
还有对字符串操作的逻辑函数和生成子串的函数。在下面的命令集4 6中假设s t r是一个字符串。 命令集4 6 字符串函数(一) b l a n k s ( n ) 返回有n个空格的字符串。 d e b l a n k ( s t r ) 返回没有后续空格的字符串 s t r。 l o w e r ( s t r ) 将s t r中所有字母转换为小写字母。 u p p e r ( s t r ) 将s t r中所有字母转换为大写字母。 i s c h a r ( s ) 如果s是字符数据类型,则返回 1;否则返回 0。在 旧版中该命令还可以使用,但是在将来的高版本中 将会被去掉。 i s l e t t e r ( s t r ( i ) ) 如果s t r中的第i个字符是字母,则返回1。 i s s p a c e ( s t r ) 返回一个和 s t r大小相同的向量。如果在 s t r中的字 符是空格、制表符或者换行符,则向量的相应位置 的元素为1;否则为0。 s t r c m p ( s t r 1 , s t r 2 ) 比较串s t r 1和串s t r 2,如果相等返回1;否则返回0。 s t r i c m p ( s t r 1 , s t r 2 ) 和s t rc m p一样,但是在比较时不区分大小写。 s t r 2 m a t ( s t r 1 , s t r 2 , . . . ) 用s t r 1、s t r 2等创建字符串矩阵。如果字符串s t r i的大小不 同,M AT L A B自动在较短的字符串后添加空格。函数最 多可以带11个参数,但是它们本身也可以是字符串矩阵。 f i n d s t r ( s t r 1 , s t r 2 ) 返回一个向量,它包含s t r 1中子串s t r 2的起始位置。 s t r r e p ( s t r 1 , s t r 2 , s t r 3 ) 在字符串s t r 1中含有s t r 2的所有位置用s t r 3来代替。 s t r t o k ( s t r 1 , s t r 2 ) 返回在s t r 1中含有s t r 2的第一个标记前所有的 s t r 1的 部分。如果s t r 2没有指定,M AT L A B使用空格,那 么就找出s t r 1中不含有空格的第一个序列。 [ o u t s t r , r s t r ] = s t r t o k 字符串o u t s t r等于s t r t o k ( s t r 1 , s t r 2 )返回值, 字符串r s t r ( s t r 1 , s t r 2 ) 等于字符串s t r 1余下的部分。 l a s t e r r 返回上一个错误信息的字符串。 l a s t w a r n 返回上一个警告信息的字符串。 ■ 例5 . 4 (a) n a m e = u p p e r (‘m a t l a b’)给出: 第5章 字符串和其他数据类型 6 9 下载 ■