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 下载 ■
70 China-bub.com MATLAB5手册 下载 name= MATLAB (b)fun=strrep('hahaha','a','i') fun= hihihi (c)假设字符串变量定义为: greet ='Welcome',where ='to Joan''s',party =.. birthday party!' 那么执行命令str2mat(greet,where,party)的结果为: ans Welcome to Joan's birthday party! (d)可使用命令strtok从用逗号分隔内容的字符串中抽取出信息来。字符串text定义为: text =.. 'Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday'; [day,rest]strtok(text,',' day Monday rest Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday 通过字符串et来调用ttok可以找到下一天等:执行命aay2,rest]=strtok(rest,',),结果为: day2 Tuesday rest Wednesday,Thursday,Friday,Saturday,Sunday 要注意的是此时调用该命令时会读取到第2个逗号处,是因为第1个逗号在开始位置,它 并不分隔字符串的任何部分。 ■ 有两个用于连接字符串的命令:strcat用于连接字符串,strvcat用于把字符串连接 成一个列向量。分析字符串的内容可以使用命令:strmatch和strcmp。 命令集47 字符串函数(二) strcat(strl,str2, 将字符串str1和str2连接起来,它不同于对细胞矩 ..) 阵操作的cat命令。 strvcat(strl,str2, 将str1和str2连接成一个列向量。str1和str2必须要 ·) 有相同的字符个数,行数可以不相等,最后结果的总 行数是它们的行数之和。 strmatch(key,strs) 检查strs中的各行,返回一个向量,它包含了行以字符 串key开头的行号
n a m e = M A T L A B (b) f u n = s t r r e p( ‘h a h a h a’ , ’a’ , ’i’ ) f u n = h i h i h i (c) 假设字符串变量定义为: 那么执行命令s t r 2 m a t ( g r e e t , w h e r e , p a r t y )的结果为: (d) 可使用命令s t r t o k从用逗号分隔内容的字符串中抽取出信息来。字符串 t e x t定义为: 通过字符串re s t来调用s t r t o k可以找到下一天等:执行命令[ d a y 2 , r e s t ] = s t r t o k ( r e s t ,’,’),结果为: 要注意的是此时调用该命令时会读取到第 2个逗号处,是因为第 1个逗号在开始位置,它 并不分隔字符串的任何部分。 有两个用于连接字符串的命令: s t r c a t用于连接字符串, s t r v c a t用于把字符串连接 成一个列向量。分析字符串的内容可以使用命令: s t r m a t c h和s t r c m p。 命令集4 7 字符串函数(二) s t r c a t ( s t r 1 , s t r 2 , 将字符串s t r 1和s t r 2连接起来,它不同于对细胞矩 . . . ) 阵操作的c a t命令。 s t r v c a t ( s t r 1 , s t r 2 , 将s t r 1和s t r 2连接成一个列向量。s t r 1和s t r 2必须要 . . . ) 有相同的字符个数,行数可以不相等,最后结果的总 行数是它们的行数之和。 s t r m a t c h ( k e y , s t r s ) 检查s t r s中的各行,返回一个向量,它包含了行以字符 串k e y开头的行号。 7 0 M ATLAB 5 手册 下载 ■
China-bub.com 第5章字符串和其他数据类型 71 下载 strncmp(str1,str2,n) 比较str1和str2中前n个字符,如果相等返回l;否则返回0。 strncmpi(str1,str2,n)和命令strncmp一样,但是在比较时不区分大小写。 ■例5.5 (a)假设A和在例5.3中定义的一样,那么: text1 'ResultMatrix =' text2 mat2str(A); restext strcat(text1,text2) 则: restext ResultMatrix =[11 3;2 4 7] 注意在等号和左括号之间没有空格,这是因为strcat去掉了所有的前置空格,如果想保 留这些空格就应该使用命令cat。 (b)有下列语句: head-['First name'’’Last name']; bo8s=['Johm'’ ,'Smith']; workers=['Arthur'’ Moore’; ’Joseph'’ ’’Jon3on'; 'Daniel', ’Smart]; 在每行中间的字符串包含两个tab符号,它是用来做表格对齐的。 Table strvcat(head,boss,workers) Table First name Last name John Smith Arthur Moore Joseph Jonson Daniel Smart 对Table来说,利用命令whos可知: whos Table Name Size Bytes Class Table 5x20 200 char array Grand total is 100 elements using 200 bytes ■ 它的大小取决于最长的行,所以它更适合于存储这种分开形式的列表。 ■例5.6 语句如下: carVocabulary strvcat('car','carpool','police car')
s t r n c m p ( s t r 1 , s t r 2 , n ) 比较s t r 1和s t r 2中前n个字符,如果相等返回1 ; 否则返回0。 s t r n c m p i ( s t r 1 , s t r 2 , n ) 和命令s t r n c m p一样,但是在比较时不区分大小写。 ■ 例5 . 5 (a) 假设A和在例5 . 3中定义的一样,那么: 则: 注意在等号和左括号之间没有空格,这是因为 s t r c a t去掉了所有的前置空格,如果想保 留这些空格就应该使用命令 c a t。 (b) 有下列语句: 在每行中间的字符串包含两个 t a b符号,它是用来做表格对齐的。 对Ta b l e来说,利用命令w h o s可知: 它的大小取决于最长的行,所以它更适合于存储这种分开形式的列表。 ■ 例5 . 6 语句如下: 第5章 字符串和其他数据类型 7 1 下载 ■
72 ATLAB5手册 China-pub.com 下载 carVocabulary car carpool police car strmatch('car',carVocabulary) ans 1 这个结果是字符串中以‘cat开头的行号。 ◆ 5.1.3显示和输入 可以通过简单地输入变量的名字来显示数字矩阵或者字符串向量的内容,见2.3节。结果 将显示出变量的名字和内容。 另一种显示变量的值就是使用命令disP。使用它只显示出变量的内容,这是有用的,特 别是在字符串的应用中。 命令集48 显示命令 disp(A) 显示矩阵A的内容,如果A是字符串,则显示出它的文本。 通过input命令来接收从终端输入的内容,它也可以显示文本和提示,见附录A.6中的例 子。从例l3.9可知命令disp可以和num2str和int2str结合使用。 命令集49 输入命令 input (out,in) 在屏幕上显示出字符串ot的文本并等待终端的输入。如果变量 i是s',则输入的内容以字符串的形式进行保存,通常 MATLAB在保存前要尽可能地求出表达式的值。如果使用格式 控制符号如n',字符串out可以是若干行。 ■例5.7 (a)读入一个实数x: x=input('Give a number x:') 显示的结果为: Give a number x:2.0944 X 2.0944 (b)读入矩阵A。input命令之后的分号用来限定输出结果。 A=input ('Give the matrix A row by row:'); 显示并输入: Give the matrix A row by row:[1 2 3 5] (©)输入时还允许使用数学表达式和函数:
这个结果是字符串中以‘c a t’开头的行号。 5.1.3 显示和输入 可以通过简单地输入变量的名字来显示数字矩阵或者字符串向量的内容,见 2 . 3节。结果 将显示出变量的名字和内容。 另一种显示变量的值就是使用命令 d i s p。使用它只显示出变量的内容,这是有用的,特 别是在字符串的应用中。 命令集4 8 显示命令 d i s p ( A ) 显示矩阵A的内容,如果A是字符串,则显示出它的文本。 通过i n p u t命令来接收从终端输入的内容,它也可以显示文本和提示,见附录 A . 6中的例 子。从例1 3 . 9可知命令d i s p可以和n u m 2 s t r和i n t 2 s t r结合使用。 命令集4 9 输入命令 i n p u t ( o u t ,i n) 在屏幕上显示出字符串o u t的文本并等待终端的输入。如果变量 i n是‘s’,则输入的内容以字符串的形式进行保存,通常 M AT L A B在保存前要尽可能地求出表达式的值。如果使用格式 控制符号如‘ \n’,字符串o u t可以是若干行。 ■ 例5 . 7 (a) 读入一个实数x: x=input('Give a number x:') 显示的结果为: (b) 读入矩阵A。i n p u t命令之后的分号用来限定输出结果。 A=input('Give the matrix A row by row:'); 显示并输入: Give the matrix A row by row: [1 2 ; 3 5] (c) 输入时还允许使用数学表达式和函数: 7 2 M ATLAB 5 手册 下载 ■
China-pub.com 第5章字符串和其他数据类型 73 下载 A=input('please give me a matrix:') 显示并输入: Please give me a matrixrand(4 hilb(4) (d)输入命令还可带多个参数: [m,n]=input('Give the size of A:') 显示并输入: Give the size of:Asize(A) (e)逻辑表达式的计算: s input('MATLAB input\nWrite an expression:' MATLAB input Write an expression:l0g2(8)+7 10 8= 0 ()读入一个字符串: name=input('What is your last name?') 显示并输入: What is your last nemd smith' 注意,在这种情况下输入的字符串要用引出。如果命令是这样: strname=input('What is your last name?','s'); 就可以直接输入字符串: What is your last ndme Smith MATLAB还有一些其他的方式来读入字符串,比如通过菜单:见14.3节。 5.1.4字符串求值 MATLAB命令可以以字符串的形式进行输入和存储。这些命令字符串通过eval命令来求值。 命令集50 字符串求值 eval(str) 执行str中包含的MATLAB命令并返回结果。 eval(str1,str2) 执行tr1中MATLAB命令,如果没有错误就和执wal(str1) 样:如果在1求值中第一个字符串是一个错误,则对字符 串s2进行求值,给出一个错误信息或者其他内容。 [x1,x2,...]=evalin 和eval一样,决定在什么样的工作区中如读/写变量来对 (aa,str) str求值。aa字符串可以是‘caller'(在evalin调用的 工作内进行求值),也可以是‘base'(在MATLAB命令执 行区来求值)。结果数据存储在x1,x2,…中。 evalin(aa,str,al奋工作区aa(见上)中试着对字符串str求值。如果不成功, 则对字符串alt求值。 assignin(aa,name,把值val赋给变量name,如果变量不存在,则新建。参
A=input('Please give me a matrix: '); 显示并输入: Please give me a matrix : rand(4)*h i l b ( 4 ) (d) 输入命令还可带多个参数: [m, n]=input('Give the size of A:') 显示并输入: Give the size of A: size(A) (e) 逻辑表达式的计算: (f) 读入一个字符串: name=input('What is your last name? '); 显示并输入: What is your last name ? 'Smith' 注意,在这种情况下输入的字符串要用 ’ ’引出。如果命令是这样: strname=input('What is your last name? ', 's'); 就可以直接输入字符串: What is your last name ? Smith M AT L A B还有一些其他的方式来读入字符串,比如通过菜单;见 1 4 . 3节。 5.1.4 字符串求值 M AT L A B命令可以以字符串的形式进行输入和存储。这些命令字符串通过e v a l命令来求值。 命令集50 字符串求值 e v a l ( s t r ) 执行s t r中包含的M AT L A B命令并返回结果。 eval(str1, str2) 执行s t r 1中的M AT L A B命令,如果没有错误就和执行e v a l ( s t r 1 ) 一样;如果在对s t r 1求值中第一个字符串是一个错误,则对字符 串s t r 2进行求值,给出一个错误信息或者其他内容。 [x1 ,x2 , . . . ] = e v a l i n 和e v a l一样,决定在什么样的工作区中如读/写变量来对 (aa, str) s t r求值。a a字符串可以是‘c a l l e r’ (在e v a l i n调用的 工作内进行求值),也可以是‘b a s e’ (在M AT L A B命令执 行区来求值)。结果数据存储在x 1,x 2, . . .中。 evalin(aa, str, alt)在工作区a a(见上)中试着对字符串s t r求值。如果不成功, 则对字符串a l t求值。 assignin(aa, name, 把值v a l赋给变量n a m e,如果变量不存在,则新建。参 第5章 字符串和其他数据类型 7 3 下载 ■
74 MATLAB5手册 China-pub.com 下载 val) 量aa表示工作区,见命令evalin。 g=inline(str,argl, 从字符串str中建立一个叫内联的函数g,如存储在工作 arg2,···) 内存中的函数,可以用g(val1,val2)来调用。函数中 参数的名字可以在字符串argl,arg2,中给出,如果 没有给出,MATLAB将从str中找出小写字母作为参数 的名字。 g=inline(str,n) 用n+1个参量x,P1,P2,,Pn来建立一个内联函数。 argnames(g) 用内联函数g中的参量名字创建一个细胞矩阵。 vectorize(g) 为了满足元素操作,在★、/和前加一个点‘,’,建立一 个向量化的内联函数g。 formula(g) 把内联函数g作为字符串返回。 char(g) 等同于formula(g)。 命令eval使得MATLAB成为一个可灵活编程的语言。比如这个命令用来调用MATLAB中 没有预定义的函数,这很有用处,见12.4节。 ■例5.8 (a)假设要编写一段简单的矩阵计算的程序来输入矩阵A和B,并且可以让用户来决定是 否进行加法或者乘法操作。程序代码如下: disp('Matrix analysis program.Give two matrices:') A input('A = B input('B =') choice input('Choose one:1 =A+B,2 A*B:) switch choice case 1,eval('disp(''Addition:,)A+B'); case 2,eval('disp(''Multiplication:);A*B'); end; 为了不结束字符串,这里应该用两个分号。在5.l.3节对命令disp和input进行了描述, 命令switch-case可参见12.1节。 由于矩阵维数的不正确等原因,如矩阵AB相乘,可能会导致一些错误,所以要求矩阵的 维数要一致。用第2个字符串作为命令eval的参数可以得到一个错误信息。通过运行下列程 序代码可以得到: disp('Matrix analysis program.Give two matrices:'); A input('A =') B input('B =') choice input('Choose one:1 A+B,2 A*B ') switch choice case 1,eval('disp(''Addition:');A+B','catchInfo'); case 2,eval('disp(''Multiplication:)A*B','catchInfo'); end;
v a l ) 量a a表示工作区,见命令e v a l i n。 g = i n l i n e ( s t r ,a r g 1, 从字符串s t r中建立一个叫内联的函数g,如存储在工作 a r g 2,. . .) 内存中的函数,可以用 g (v a l 1 ,v a l 2 . . .)来调用。函数中 参数的名字可以在字符串 a r g1,a r g2,. . .中给出,如果 没有给出, M AT L A B将从s t r中找出小写字母作为参数 的名字。 g = i n l i n e ( s t r , n ) 用n+ 1个参量x,P 1,P 2,. . .,P n来建立一个内联函数。 a r g n a m e s ( g ) 用内联函数g中的参量名字创建一个细胞矩阵。 v e c t o r i z e ( g ) 为了满足元素操作,在 *、/和^前加一个点 ‘ .’,建立一 个向量化的内联函数g。 f o r m u l a ( g ) 把内联函数g作为字符串返回。 c h a r ( g ) 等同于f o r m u l a ( g )。 命令e v a l使得M AT L A B成为一个可灵活编程的语言。比如这个命令用来调用 M AT L A B中 没有预定义的函数,这很有用处,见 1 2 . 4节。 ■ 例5 . 8 (a) 假设要编写一段简单的矩阵计算的程序来输入矩阵 A和B,并且可以让用户来决定是 否进行加法或者乘法操作。程序代码如下: 为了不结束字符串,这里应该用两个分号。在 5 . 1 . 3节对命令d i s p和i n p u t进行了描述, 命令s w i t c h - c a s e可参见1 2 . 1节。 由于矩阵维数的不正确等原因,如矩阵 A B相乘,可能会导致一些错误,所以要求矩阵的 维数要一致。用第 2个字符串作为命令 e v a l的参数可以得到一个错误信息。通过运行下列程 序代码可以得到: 7 4 M ATLAB 5 手册 下载