第七章 字符串处理 7.1 字符阵列 7.2 字符串单元阵列 7.3 字符串比较 7.4 字符串搜索与取代 7.5 字符串与数值之间的变换 第七章 字符串处理 7.1 字符阵列 7.2 字符串单元阵列 7.3 字符串比较 7.4 字符串搜索与取代 7.5 字符串与数值之间的变换 7.6 综合设计示例 7.7 字符串函数 习题
7.1 字 符 阵 列 在MATLAB中,字符是以其ASCII码表示的,这样可直接在屏幕上显示字符或者在打印机上打印字符。输入字符数据时应用单引号括起来,例如输入 >> name='西安电子科技大学电子工程学院'; 这时采用class命令可以检查其类型 >>class(name) ans= char
这说明变量name的类型为字符型,再输入 size(name) ans= 1 14 这说明name占用1×14向量,从这可以看出每个汉字只占用一个字符位置。众所周知,一个汉字需要用两个字节的内码表示,每个字符应该占用两个字节,这一点可由下列命令得到证实:
>> name1='MATLAB'; >> whos Name Size Bytes Class ans 1x4 8 char array name 1x14 28 char array name1 1x6 12 char array Grand total is 24 elements using 48 bytes 变量name含有14个汉字,占用了28个字节,然而,name1包含有6个英文字母,占用12个字节,这说明每个字符都采用16位的ASCII码存储。
7.1.1 字符与ASCII码之间的变换 在MATLAB中,每个字符按16位的ASCII码存储,这大大方便了在MATLAB中使用双字节内码字符集,如汉字系统。利用double和char函数可在字符与其ASCII码之间进行转换。例如,在得到上述name和name1后输入 >> a1=double(name1) a1 = 77 65 84 76 65 66 >> a=double(name) a = Columns 1 through 8
52983 45234 46567 55251 49094 48316 46323 53671 Columns 9 through 14 46567 55251 47524 46028 53671 54458 >> aname1=char(a1) aname1 = MATLAB >> aname=char(a) aname = 西安电子科技大学电子工程学院
7.1.2 建立二维字符阵列 在建立二维阵列时,应注意确保每行上的字符数相等,如果长度不等,应在其后补空格。例如输入 >> str1=['MATLAB ';'SIMULINK'] str1= MATLAB SIMULINK
必要时可利用blanks函数补上空格,例如输入 >>book1='MATLAB Programming Language'; >>book2='Signal Processing using MATLAB'; >>book3='Control System using MATLAB'; >>book4='Neural Network using MATLAB'; disp([length(book1),length(book2),length(book3),length(book4)]) 27 30 27 27 >> BOOK=[book1 blanks(3);book2;book3 blanks(3);book4 blanks(3)] BOOK = MATLAB Programming Language Signal Processing using MATLAB Control System using MATLAB Neural Network using MATLAB
当从字符阵列中提取字符串时,可利用deblank函数删除字符串末尾多余的空格 >> str2=BOOK(1,:);length(str2) ans = 30 >> str3=deblank(str2);length(str3) 27 这说明在str3中已删除了末尾的空格。
7.2 字符串单元阵列 建立字符串单元阵列存储字符串,比字符阵列更方便、更灵活。MATLAB专门为处理字符串单元阵列提供了函数,如cellstr,findstr等。 利用cellstr函数可方便地将字符阵列变换成字符串单元阵列。例如,在上面已得到BOOK字符阵列后,输入
>> BOOKcell=cellstr(BOOK) 'MATLAB Programming Language' 'Signal Processing using MATLAB' 'Control System using MATLAB' 'Neural Network using MATLAB' 建立了字符单元阵列BOOKcell,这时每个元素均为字符串,而且已删除了末尾的空格,这可通过length函数求取其长度来证实。 length(BOOKcell{1}) ans= 27
相反,利用char函数可将字符单元阵列变换成字符阵列, 而且能够自动在阵列元素中加上适当的空格,以便使每行的长度相等。 >> BOOK1=char(BOOKcell) BOOK1 = MATLAB Programming Language Signal Processing using MATLAB Control System using MATLAB Neural Network using MATLAB
7.3 字 符 串 比 较 比较字符串可有以下几种方式: ● 比较两个字符串或其部分是否相同。 ● 比较两个字符串中的个别字符是否相同。 7.3 字 符 串 比 较 比较字符串可有以下几种方式: ● 比较两个字符串或其部分是否相同。 ● 比较两个字符串中的个别字符是否相同。 ● 可对字符串中的每个元素进行归类,如根据是字母还是非字母进行归类。 MATLAB为这些任务提供了一些专用的函数,如strcmp、strcmpi、strncmp、strncmpi和findstr等,它们既适用于字符阵列,也适用于字符单元阵列。
7.3.1 比较字符串是否相同 strcmp函数用于比较两字符串是否相同,strcmpi函数则在比较时忽略其大、小写,即ABC等同于abc;strncmp函数用来比较两字符串的前n个字符是否相同,同样strncmpi比较时忽略大、小写。例如,在MATLAB中输入
>> str1='hello'; str2='help!'; str3='Hello'; >>k1=strcmp(str1,str2) k1 = >> k2=strcmp(str1,str3) k2 = >> k3=strcmpi(str1,str3) k3 = 1 >> k4=strncmp(str1,str2,3) k4 =
7.3.2 比较字符是否相同 当要比较两个字符串中个别字符是否相同时,可采用MATLAB的关系操作符。例如: >> str1='hello'; str2='help!'; k=str1= =str2 k = 1 1 1 0 0
实际上,还可以采用其它的关系操作符(<、<=、>、>=、 实际上,还可以采用其它的关系操作符(<、<=、>、>=、!=),这样就可以比较两个字符串的大小关系,当然实际确定其大小关系时采用的是其ASCII码。例如: >> A='abcd'; B='aabe'; >>k1=A>B k1 = 0 1 1 0 >> k2=A>=B k2 = 1 1 1 0 >> k3=A<B k3 = 0 0 0 1
7.3.3 英文字母的检测 在实际应用中,经常需要检测字符串是否有英文字母,或者检测是否全部由字母构成,MATLAB专门为此提供了函数isletter。有时也需要检测字符串是否有空格,可采用isspace函数。例如: >> myaddr='XiDian 134'; >>letter=isletter(myaddr) letter = 1 1 1 1 1 1 0 0 0 0 >> space=isspace(myaddr) space = 0 0 0 0 0 0 1 0 0 0
联合isletter和isspace这两个函数,可检测字符串是否全部由字母和空格构成。例如: >> str1='I wish this book can be beneficial to you'; >> let1=isletter(str1); >> let2=isspace(str1); >> let3=let1| let2; >>if all(let3) disp('所有字符均为英文字母或空格') else disp('字符中包含非英文字母和空格') end
执行后得 所有字符均为英文字母或空格 如果输入改为 str1='My post address is XiDian Box 134'; 则执行后得 字符中包含非英文字母和空格
7.4 字符串搜索与取代 MATLAB为字符串的搜索与取代提供了几个函数findstr、strmatch、strrep、strtok等,这几个函数的灵活运用,可完成比较复杂的任务。例如: >> str='Example 12 made on 08/18/05'; >>k=findstr(str,'08') k = 20 >> str1=strrep(str,'18','19') str1 = Example 12 made on 08/19/05 这里将str中的日期修改为2005年08月19日。
利用strtok函数可找出字符串的首部(第一个分隔符之前的字符串): >>str2=strtok(str1) str2= Example
利用strtok函数还可以完成从英文句子中提取单词,为此编写函数来实现: function allwords=words(sentence) r=sentence allwords=''; while(any(r)) [w,r]=strtok(r); allwords=strvcat(allwords,w); end
这时输入 >> str1='I wish this book can be benefical to you'; >>str1words=words(str1) str1words= I wish this book can be beneficial to you
7.5 字符串与数值之间的变换 MATLAB提供了一组函数可用来在各种数制之间进行变换。例如: >> x=53176251; 7.5 字符串与数值之间的变换 MATLAB提供了一组函数可用来在各种数制之间进行变换。例如: >> x=53176251; >> y=int2str(x) y = 53176251 >> whos Name Size Bytes Class x 1x1 8 double array y 1x8 16 char array Grand total is 9 elements using 24 bytes
从这可以看出,x只占用一个存储单元(8个字节),而当它变换成字符时占用了8个字符单元(每个单元占用2个字节)。在将数值表示成字符串时还可以指定位数,如 >> p=num2str(pi,8) p = 3.1415927 >> d1=bin2dec('10101') d1 = 21 >> b1=dec2bin(d1,8) b1 = 00010101 >> d2=hex2dec('A1B') d2 =
2587 >> h2=dec2hex(d2,4) h2 = 0A1B >> d3=base2dec('12210',3) d3 = 156 >> t3=dec2base(d3,3) t3 = 12210 其中,最后一组完成在三进制数与十进制数之间进行转换。
只有利用num2str函数才能将含小数的数值变换成字符串,从而可以在图形标题或标记中使用与数据相关的数值。例如,假设已利用plot(x,y)绘制出图形,则可给x轴加上这样的标记:
>>str1=num2str(min(x)); >>str2=num2str(max(x)); >>str=['Vaue of x is from',str1,'to',str2]; >>xlabel(str) 利用mat2str函数可将矩阵变换成字符串形式。例如: >> A=round(100*rand(3,3) -50)/100 A = 0.4500 -0.0100 -0.0400 -0.2700 0.3900 -0.4800 0.1100 0.2600 0.3200 >> B=mat2str(A) B = [0.45 -0.01 -0.04; -0.27 0.39 -0.48; 0.11 0.26 0.32]
7.6 综合设计示例 为说明字符串的应用,设计MATLAB程序对保存在文件中的文本进行处理,要求: 7.6 综合设计示例 为说明字符串的应用,设计MATLAB程序对保存在文件中的文本进行处理,要求: (1) 统计文件中字符串 'error' 出现的次数。 (2) 将文件中的字符串 'error' 修改成 'Error'。 (3) 统计文件中字符('a','b', 't')出现的次数及频度。 (4) 统计文件中单词('the', 'and')出现的次数。
这里假设要处理的文件为bugs.txt,其内容为 LaTeX Error Reports 12 January 1999 ERROR REPORTS Before you report an error please check that: * Your LaTeX system is not more than one year old. New LaTeX releases occur at 6 monthly intervals, thus your problem may have already been fixed. * The error is not already fixed by a patch added recently to the current distribution. If you have access to a CTAN archive then you can easily check whether there is already a patch that fixes your problem; so please do so. The patches are described in the
files patches.txt and ltpatch.ltx; these are in the current distribution. This check is especially important if you are using a distribution that is more than one month old. * The error is not already mentioned in the documentation of the distribution, e.g. in a .dtx file (in this case it is a feature : -). * The error has not already been reported. If you have WWW access, you can search the LaTeX bugs database using this URL: http://www.latex-project.org/bugs.html * The error is not caused by software other than the core LaTeX software that is produced and maintained by the LaTeX3 project team (please report problems with other software to the authors or suppliers of that software).
* The error is not caused by using an obsolete version of any file or of other software. * You are using the original version of all files, not one that has been modified elsewhere. If you think you have found a genuine bug in a recent version of the core LaTeX software, please report it in the following way: * Prepare a *short* test file that clearly demonstrates your problem; see below for a discussion of 'short'. * Run this file through latex to obtain the transcript file (often .log) since you will need to submit this file also. * Generate a bug report template by running the file latexbug.tex through LaTeX.
* Fill in the spaces in the generated template file. Please note that the reporting language is *English* irregardless of the fact, that the address you are sending the bug report to, might not be in an English speaking country. Reports received in a language other than English might not be understandable for the person currently looking at bug reports! * Include all necessary information, especially a complete input file, a complete transcript file, and all other files used (if they are not standard).
步骤1:读取文件,建立字符串。 为处理文件中的字符串,先打开文件,读取文件,存入字符串变量。这里要用到有关文件的输入/输出函数,本书未对此进行讨论,因此,有必要对文件的输入/输出函数作一简要介绍,详见MATLAB的在线帮助。 (1) fid = fopen(filename,permission)可打开指定的文件filename,其中permission用于指定允许的操作方式,当permission取r、w、r+或w+、a时,分别表示可对文件进行读、写、读写、在文件尾写的操作,fid为代表这一文件的文件标识符。
(2) [A,count] = fread(fid,size,precision)可对已打开的文件fid进行读操作,其中size表示一次读取的字符数,当size取Inf时,表示读至文件尾。precision表示读取的字符的精度,当取'char'、'uchar'、'schar'时,表示读取字符、无符号字符、有符号字符;当取'int8'、'int16'、'int32'、'int64'时,表示读取整数(8、16、32、64位);当取'uint8'、'uint16'、'uint32'、'uint64'时,表示读取无符号整数;当取'float32'、'float64'时,表示读取浮点数(32、64位)等。A为读取的内容,count记录所读取的长度。 (3) count=fwrite(fid,A,precision)可将数据A按指定的格式写入文件fid,输出变量count记录所写入的长度。
(4) status=fclose(fid)可关闭指定的文件fid,status记录关闭文件操作的状态,关闭成功时status=0,否则status=-1;status = fclose('all')表示关闭已打开的所有文件。 有了这些函数,可以编写出读取文件字符的函数readfile: function [y,count]=readfile(filename) fid = fopen(filename); [y,count] = fread(fid,Inf,'char'); fclose(fid); 这样可方便地读入文件,并建立字符阵列: >> [yi,ct]=readfile('bugs.txt'); >> y=char(yi')
步骤2:统计'error'出现的次数。 这只需要直接应用findstr函数找出字符串 'error' 在y中的位置,然后求出位置的个数。 >> k=findstr(y,'error'); L1=length(k); disp(['字符串''error''出现的次数为',num2str(L1)]) 执行后得 字符串'error'出现的次数为6
步骤3:将'error'修改成'Error'。 这只需要直接应用strrep函数,在字符串y中将 'error' 修改成 'Error',替换结果只显示出第一段。 >> y1=strrep(y,'error','Error'); disp('''error''修改成''Error''后的结果:') disp(char(y1(1:322)))
执行后得 'error'修改成'Error'后的结果: LaTeX Error Reports 12 January 1999 ERROR REPORTS Before you report an Error please check that: * Your LaTeX system is not more than one year old. New LaTeX releases occur at 6 monthly intervals, thus your problem may have already been fixed.
步骤4:统计字符('a','b','t')出现的次数及频度。 为统计字符出现的次数,先编写出函数countchar,其中使用了关系操作符: function y=countchar(str,c) %统计字符出现的次数 k=upper(str)==upper(c); y=sum(k);
还应注意,适当处理大、小写英文字母,这里先将字符都变换成大写字母,然后进行比较,这也说明countchar函数只适用于统计英文字母出现的次数,有了这个函数后可很容易地求出字符 ('a','b','t')出现的次数及频度。 c1=countchar(y,'a'); c2=countchar(y,'b'); c3=countchar(y,'t'); disp(['字符a,b,t出现的次数分别为',num2str([c1,c2,c3])]) cc=round(1000*[c1/ct,c2/ct,c3/ct])/100; disp(['字符a,b,t出现的频度分别为百分之',num2str(cc, '%-5.2g')]) 执行后得 字符a, b, t出现的次数分别为146 33 192 字符a, b, t出现的频度分别为百分之0.57 0.13 0.75
步骤5:统计单词('the', 'and')出现的次数。 同样,为统计单词出现的次数,先编写出函数countword,这里先将字符都变换成大写字母,然后利用7.4节设计的单词提取函数words对字符串y进行处理,最后利用strmatch函数查找严格匹配的子字符串: function y=countword(str,w) %统计单词出现的次数 str1=upper(str); w1=upper(w); str2=words(str1); k=strmatch(w1,str2,'match'); y=length(k);
有了这个函数后可以很容易地求出单词出现的次数: w1=countword(y, 'the'); w2=countword(y, 'and'); disp(['单词the, and出现的次数分别为', num2str([w1, w2])]) 执行后得 单词the,and出现的次数分别为27 3
最后我们给出整个MATLAB程序: clear %读取文件,建立字符串 [yi,ct]=readfile('bugs.txt'); y=char(yi'); %统计'error'出现的次数 k=findstr(y,'error'); L1=length(k); disp(['字符串''error''出现的次数为',num2str(L1)]) %将'error'修改成'Error' y1=strrep(y,'error','Error'); disp('''error''修改成''Error''后的结果:')
disp(char(y1(1:322))) %统计字符出现的次数('a','b','t')及频度 c1=countchar(y,'a'); c2=countchar(y,'b'); c3=countchar(y,'t'); disp(['字符a,b,t出现的次数分别为',num2str([c1,c2,c3])]) cc=round(1000*[c1/ct,c2/ct,c3/ct])/100; disp(['字符a,b,t出现的频度分别为百分之',num2str(cc,'%-5.2g')]) %统计单词出现的次数('the','and') w1=countword(y,'the'); w2=countword(y,'and'); disp(['单词the,and出现的次数分别为',num2str([w1,w2])])
7.7 字 符 串 函 数 表7.1 字 符 串 函 数
7.7.1 一般函数 1.char 功能:建立字符阵列。 格式: S=char(X) S=char(C) S=cahr(t1,t2,t3,…)
说明: S=char(X)可将X中以字符ASCII码表示的值转换成相应的字符,利用double函数可作相反的变换。 在S=char(C)中,C表示字符串的单元阵列,这条命令可将单元阵列中的字符串变换成字符阵列S,利用cellstr可作相反的变换。 在S=char(t1,t2,t3,…)中,t1,t2,t3,…为字符串的行阵列,则S是以t1,t2,t3,…为行构成的二维字符矩阵,其行尺寸取t1,t2,t3,…中的最长者,其它字符行阵列在末尾补空格,使所有行阵列等长,从而构成二维字符矩阵S。
例如,分三行打印出其ASCII为32~127之间的字符,可输入 >> s=char(reshape(32:127,32,3)') s = !"#$%&'()*+,-./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ 'abcdefghijklmnopqrstuvwxyz{|}~'
2.double 功能:将字符阵列变换成双精度数值。 格式: Y=double(X) 说明: Y=double(X)可将字符阵列X转换成其ASCII码,如果X本身已经是双精度数值,则double函数不起作用。例如:
>> s='ABC'; >> y=double(s) y = 65 66 67 >> z=double(y) z =
3. cellstr 功能:从字符阵列中建立单元阵列。 格式: C=cellstr(s) 说明: (参见6.5节。)
4.blanks 功能:建立空格字符串。 格式: s=blanks(n) 说明: s=blanks(n)可产生n个空格。例如: >>disp(['XXX' blanks(5) 'yyy']) 则可在XXX与yyy之间加上5个空格。
5.deblank 功能:删除字符串末尾的空格。 格式: str=deblank(str) c=deblank(c) 说明: str=deblank(str)可删去字符串str中末尾的空格;在c=deblank(c)中,c为字符串的单元阵列,可将deblank函数应用于c中的每个元素。例如:
>> A{1,1} = 'MATLAB '; >>A{1,2} = 'SIMULINK '; >>A{2,1} = 'Toolboxes '; >>A{2,2} = 'The MathWorks ' >>A = 'MATLAB ' 'SIMULINK ' 'Toolboxes ' 'The MathWorks ' >> B=deblank(A) B = 'MATLAB' 'SIMULINK' 'Toolboxes' 'The MathWorks'
6. eval 功能:计算以字符串表示的MATLAB表达式。 格式: a=eval(expresssion) [a1, a2, a3, …] = eval(function(b1, b2, b3, …)) 说明: a=eval(expression)可计算出MATLAB表达式expression的值,expression = [string1, int2str(var), string2, …];在[a1, a2, a3, …] = eval(function(b1, b2, b3, …))中,b1, b2, b3, …为函数function的输入变量,计算结果保存在a1,a2,a3,…中。例如,输入
>> A = '4*5-3'; eval(A) ans = 17 >> [e,v]=eval('eig([2 4; -6 5])') e = 0.1936 - 0.6021i 0.1936 + 0.6021i 0.7746 0.7746 v = 3.5000 + 4.6637i 0 0 3.5000 - 4.6637i >> P = 'pwd'; eval(P) C:\Program Files\MATLAB704\work
这时可得到程序pwd.m所在的位置。输入 >>D = ['odedemo '; 'quaddemo'; 'zerodemo';'fitdemo ']; >>n = input('Select a demo number: '); >>eval(D(n,:)) 则可选择执行不同的演示程序。
7.7.2 字符串测试 1.ischar 功能:检测到字符阵列(字符串)时为逻辑真。 格式: k=ischar(s) 说明: 在k=ischar(s)中,当s为字符阵列或字符串时,k为逻辑真(其值为1),否则k为0。
2.iscellstr 功能:检测到字符串的单元阵列时为逻辑真。 格式: k=iscellstr(s) 说明: 在k=iscellstr(s)中,当s为字符串的单元阵列时,k为逻辑真(其值为1),否则k为0。
3.isletter 功能:检测到英文字母时为逻辑真。 格式: TF=isletter(str) 说明: 在TF=isletter(str)中,当str中某一位为英文字母时,对应的TF中的单元为逻辑真,否则为逻辑假。例如: >> str='MAX is 1200'; >> TF=isletter(str) TF = 1 1 1 0 1 1 0 0 0 0 0
4.isspace 功能:检测到空格时为逻辑真。 格式: TF=isspace(str)
说明: 在TF=isspace(str)中,当str中某一位为空白(即空格、换行、回车、制表符Tab、垂直制表符、打印机走纸符)时,相应的TF中的单元为逻辑真,否则为逻辑假。例如: >> str='MAX is 1200'; >> TF=isspace(str) TF = 0 0 0 1 0 0 1 0 0 0 0
7.7.3 字符串操作 1.strcat 功能:字符串连接。 格式: t=strcat(s1,s2,s3,…) 说明: t=strcat(s1,s2,s3,…)可按水平方向连接字符串s1,s2,s3,…,并忽略尾部添加的空格。所有的输入s1,s2,s3,…必须具有相同的行数。当输入全为字符阵列时,t也为字符阵;当输入中包含有字符串的单元阵列时,则t为单元阵列。例如:
>> a='Hello'; b='how are you!'; c=strcat(a,b) c = Hellohow are you! >> d=[a b] d = Hello how are you!
2.strvcat 功能:字符串的垂直连接。 格式: t=strvcat(s1,s2,s3,…) 说明: strvcat与strcat函数类似,只是按垂直方向连接字符串s1,s2,s3,…,即以s1,s2,s3,…作为t的行,为此会自动在s1,s2,s3,…的尾部补空格以形成字符串矩阵。例如:
>> s1='first'; s2='string'; s3='matrix'; s4='second'; >> t1=strvcat(s1,s2,s3) t1 = first string matrix >> t2=strvcat(s4,s2,s3) t2 = second
3.strcmp 功能:比较字符串。 格式: k=strcmp(str1,str2) TF=strcmp(S,T) 说明: k=strcmp(str1,str2)可对两个字符串str1和str2进行比较,如果两者相同,则返回逻辑真(其值为1),否则返回逻辑假(0);在TF=strcmp(S,T)中,S、T为字符串单元阵列,TF与S、T尺寸相同,且当相应T、S元素相同时其值为1,否则为0。注意T、S必须具有相同的尺寸,或者其中之一为标量。例如:
>> strcmp('Yes','No') ans = >> strcmp('Yes','Yes') 1 >> A={'MATLAB' 'SIMULINK';'Toolboxes' 'The MathWorks'} A = 'MATLAB' 'SIMULINK' 'Toolboxes' 'The MathWorks' >> B={'Handle Graphics' 'Real Time Workshop';'Toolboxes' 'The MathWorks'}
B = 'Handle Graphics' 'Real Time Workshop' 'Toolboxes' 'The MathWorks' >> C={'Signal Processing' 'Image Processing';'MATLAB' 'SIMULINK'} C = 'Signal Processing' 'Image Processing' 'MATLAB' 'SIMULINK' >> strcmp(A,B) ans = 0 0 1 1 >> strcmp(A,C)
4.strcmpi 功能:比较字符串(忽略大、小写)。 格式: k=strcmpi(str1,str2) TF=strcmpi(S,T) 说明: strcmpi与strcmp函数类似,只是在比较时忽略字符的大、小写,有关说明参见strcmp函数。例如:
>> s1='matrix'; s2='Matrix'; >> strcmpi(s1,s2) ans = 1 >> strcmp(s1,s2)
5.strncmp 功能:比较两个字符串的前n个字符。 格式: k=strncmp(str1,str2,n) TF=strncmp(S,T,n) 说明: strncmp函数与strcmp函数类似,只是strncmp函数根据字符串的前n个字符产生结果,说明部分可参见strcmp函数。例如:
>> s1='MATLAB expression'; >>s2='MATLAB variable'; >>k1=strncmp(s1,s2,6) k1 = 1 >> k2=strcmp(s1,s2) k2 =
6.strncmpi 功能:比较两个字符串的前n个字符(忽略大、小写)。 格式: k=strncmpi(str1,str2,n) TF=strncmpi(S,T,n)
说明: strncmpi与strncmp函数类似,只是strncmpi在比较字符串的前n个字符时,忽略其大、小写,这里不再赘述。例如: >>s1='MATLAB expression'; >>s2='matlab variable'; >>k1=strncmpi(s1,s2,6) k1 = 1 >> k2=strncmp(s1,s2,6) k2 =
7.findstr 功能:在字符串中查找子字符串。 格式: k = strfind(str, pattern) k = strfind(cellstr, pattern) k=findstr(str1,str2)
说明: k = strfind(str, pattern)可在字符串str中找出字符串pattern所在的位置,如果在str中包含有多个pattern 字符串,则得到一个行向量,分别给出其位置。k = strfind(cellstr, pattern) 可以在单元阵列cellstr中搜索字符子串pattern。例如: >> str1='MATLAB is a high-performance language for technical computing.'; >> str2='language'; >> k=findstr(str1,str2) k = 30
8.strjust 功能:调整字符阵列。 格式: t=strjust(s) t=strjust(s,'left') t=strjust(s,'right') t=strjust(s,'center')
说明: t=strjust(s)或t=strjust(s,'right')可对字符阵列s中的每行字符按右对齐排列; t=strjust(s,'left')则可按左对齐排列;t=strjust(s,'center')可按居中对齐排列。例如输入 >> s=['MATLAB ';'SIMULINK'] s = MATLAB SIMULINK >> t=strjust(s,'right') t =
9.strmatch 功能:查找匹配字符串。 格式: k=strmatch(str,STR) k=strmatch(str,STR,'exact') 说明: k=strmatch(str,STR)可在STR字符串中找出以str开头的字符串位置;k=strmatch(str,STR,'exact')可找出严格以str开头的字符串的位置。例如:
>> k1=strmatch('max',strvcat('max','minimax','maximum')) 3 >> k2=strmatch('max',strvcat('max','minimax','maximum'),'exact') k2 =
10.strrep 功能:字符串的搜索与取代。 格式: str=strrep(str1,str2,str3) 说明: str=strrep(str1,str2,str3)可在字符串str1中找出子字符串str2,并以str3取代。例如: >>s1= 'This is a good example.'; >>str = strrep(s1,'good','great') str = This is a great example.
>>A ={'MATLAB','SIMULINK' 'Toolboxes','The MathWorks'}; >>B = {'Handle Graphics','Real Time Workshop' >>C = {'Signal Processing','Image Processing' 'MATLAB','SIMULINK'}; >>strrep(A,B,C) ans= 'MATLAB' 'SIMULINK'
11.strtok 功能:找出字符串的首部。 格式: token=strtok(str) token=strtok(str,delimiter) [token,rem]=strtok(…)
说明: token=strtok(str,delimiter)可找出字符串str的首部,即位于第一个分隔符之前的一串字符,其中向量delimiter用于指定有效的分隔符。 token=strtok(str)可以指定采用缺省的分隔符,即空格(ASCII码为32)、Tabs(ASCII码为9)和回车(ASCII码为13)。 [token,rem]=strtok(…)除得到字符串的首部token外,还得到了剩余字符串rem。
例如: >> s='This is a good example.'; >> [token,rem]=strtok(s) token = This rem = is a good example.
12.upper 功能:将字符串变换为大写。 格式: t=upper(str) B=upper(A) 说明: t=upper(str)可将str中的小写字母变换成大写字母,其它字符不变。B=upper(A)可将字符串单元阵列A中的小写字母变换成大写字母。例如: >> upper('Matlab V7.0') ans = MATLAB V7.0
13.lower 功能:将字符串变换为小写。 格式: t=lower(str) B=lower(A) 说明: t=lower(str)可将str中的大写字母变换为小写字母,其它字符不变。B=lower(A)可将字符串单元阵列A中的大写字母变换成小写字母。例如: >> lower('Matlab V7.0') ans = matlab v7.0
7.7.4 字符串与数值之间的变换 1.num2str 功能:将数值变换成字符串。 格式: str=num2str(A) str=num2str(A,precision) str=num2str(A,format)
说明: num2str函数可将数值变换成字符串表示,利用这种函数可方便地在图形标记和标题中使用数值。 str=num2str(A)可将阵列A变换成以四位小数精度表示的字符串,如需要可指定以指数形式表示。在str=num2str(A,precision)中,可在precision中指定有效的数字位数;在str=num2str(A,format)中,可由format指定字符的格式,缺省时取'%11.4g',表示最长取11位有效数字,其中4位小数。
表7.2 format格式选项
注意,不是所有的format选项都适用于num2str函数。例如: >> num2str(pi) ans = 3.1416 >> num2str(eps) 2.2204e-016 >> num2str(pi,'%-10.6e') 3.141593e+000 >> num2str(-pi,'%-10.6e') -3.141593e+000
>> num2str(pi,'%10.6f') ans = 3.141593 >> num2str(pi,'%-10.6g') 3.14159 >> num2str(pi,'%+10.6e') +3.141593e+000 >> num2str(-pi,'%+10.6e') -3.141593e+000
2.int2str 功能:将整数变换成字符串。 格式: str=int2str(N) 说明: str=int2str(N)可将整数N变换成字符串,输入N可以是标量、向量,还可以是矩阵,对输入的非整数值在变换之前被截断。例如:
>> s1=int2str(2+5) s1 = 7 >> s2=int2str(pi) s2 = 3 >> s3=int2str(10*randn(3,3)) s3 = -4 3 12 -17 -11 0 1 12 3
3.mat2str 功能:将矩阵变换成字符串。 格式: str=mat2str(A) str=mat2str(A,n) 说明: str=mat2str(A)可将矩阵A变换成字符串,这样可用作eval函数的输入;str=mat2str(A,n)可在变换时采用n位精度。例如:
>> A=[1 2;3 4] A = 1 2 3 4 >> b=mat2str(A) b = [1 2;3 4] 这时b为字符串,利用eval(b)可重新产生矩阵A。
4.str2mat 功能:从字符串中形成矩阵。 格式: S = str2mat(T1, T2, T3, …) 说明: S = str2mat(T1, T2, T3, …)可以将由字符串T1, T2, T3, …表示的数据当成矩阵的行,如果字符串不等长,则会自动补上空格。这个函数可以由char函数取代,在以后版本中可能会被废弃。例如:
>> x = str2mat('36842', '39751', '38453', '9030') x = 36842 39751 38453 9030
5.str2num 功能:将字符串变换为数值。 格式: X=str2num(str) 说明: str2num是num2str的逆函数。x=str2num(str)可将表示数值的字符串str变换为数值。
例如: >> str2num('pi') ans = 3.1416 >> str2num(['1.2 3.2';'5.8 9.0']) 1.2000 3.2000 5.8000 9.0000
6.sprintf 功能:将格式化数据写入字符串。 格式: s=sprintf(format,A,…) [s,errmsg]=sprintf(format,A,…)
说明: s=sprintf(format,A,…)可对矩阵A(及其它矩阵)中的数据按指定格式(由format指定)进行格式化,并写入MATLAB的字符串变量s中。sprintf函数几乎等同于fprintf函数,只是sprintf函数不将结果写入文件。 format用于指定输出格式的表示法、对齐格式、有效数字、域宽度及其它方面的信息,参见表7.2 (format选项格式)。 [s, errmsg]=sprintf(format, A, …)还可以在发生错误时得到出错信息errmsg。例如输入
>> sprintf('%0.5g',(1+sqrt(5))/2) ans = 1.618 >> sprintf('%0.5g',1/eps) 4.5036e+015 >> sprintf('%15.5f',1/eps) 4503599627370496.00000 >> sprintf('%d',round(pi)) 3 >> sprintf('%s','hello') hello >> sprintf('The array is %dx%d.',2,3) The array is 2x3. >> sprintf('\n')
7.sscanf 功能:在指定格式下读取字符串。 格式: A=sscanf(s, format) A=sscanf(s, format, size) [A,count, errmsg, nextindex]=sscanf(…) 说明: A=sscanf(s,format)可从MATLAB字符串变量s中按指定格式format读取数据进行变换。format格式选项参见表7.2。 A=sscanf(s,format,size)可指定读取数据的尺寸(由size指定),然后加以变换。当size=n时,表示读取n个元素;当size=Inf时,表示读取至文件尾;当size=[m,n]时可读取m×n的矩阵。
[A, count,errmsg,nextindex]=sscanf(…)可从文件中读取A,并得到了读取数据量的记录count、发生错误时的出错信息errmsg以及已扫描过的字符数nextindex。例如输入 >> s='2.7183 3.1416'; >> A=sscanf(s,'%f') A = 2.7183 3.1416
7.7.5 数制变换 1.hex2num 功能:将十六进制数变换成双精度数。 格式: f=hex2num('hex_value')
说明: f=hex2num('hex_value')可将十六进制数表示的字符hex_value变换成相应的IEEE双精度浮点数(双精度浮点数由64位二进制数构成,从高位到低位依次为符号位(1位)、整数位(11位)、小数位(52位)),这一函数可正确地处理NaN、Inf及非正常值,短于16个字符的hex_value会自动在右边补零。例如: >> f=hex2num('400921fb54442d18') f = 3.1416
2.hex2dec 功能:将十六进制数变换成十进制数。 格式: d=hex2dec('hex_value')
说明: d=hex2dec('hex_value')可将hex_value变换成浮点整数表示,其中hex_value为以MATLAB字符串表示的十六进制整数。例如: >> d=hex2dec('1FF') d = 511 >> s={'20';'80';'3ff'}; >> e=hex2dec(s) e = 32 128 1023
3.dec2hex 功能:将十进制数变换成十六制数。 格式: str=dec2hex(d) str=dec2hex(d,n) 说明: str=dec2hex(d)可将十进制整数d变换成以MATLAB字符串表示的十六进制数,其中d必须为非负的整数,且其值小于252。
str=dec2hex(d,n)表示产生的str至少为n位,不够位数时在左边补0。例如: >> s1=dec2hex(1023) s1 = 3FF >> s2=dec2hex(1023,4) s2 = 03FF
4.bin2dec 功能:将二进制数变换为十进制数。 格式: d=bin2dec(binarystr) 说明: d=bin2dec(binarystr)可将以字符串形式表示的二进制数binarystr变换成相应的十进制数。例如输入 >> d1=bin2dec('01111111') d1 = 127 >> d2=bin2dec('10001011') d2 = 139
5.dec2bin 功能:将十进制数变换成二进制数。 格式: str=dec2bin(d) str=dec2bin(d,n) 说明: str=dec2bin(d)可将十进制正整数d变换成二进制数(以字符串表示),d必须为非负整数,且其值小于252。
str=dec2bin(d,n)表示产生的str至少为n位,不足n位时在左边补0。例如: >> d1=dec2bin(53) d1 = 110101 >> d2=dec2bin(53,8) d2 = 00110101
6.base2dec 功能:将任意进制数变换成十进制数。 格式: d=base2dec(str,base) 说明: d=base2dec(str,base)可将任意进制(由base指定)的数str(以字符串表示)变换成相应的十进制数,其中base为从2到36之间的整数,表示指定进制的基数。例如:
>> d1=base2dec('201',3) d1 = 19 >> d2=base2dec('201',8) d2 = 129 >> d3=base2dec('11',36) d3 = 37
7.dec2base 功能:将十进制数变换成任意进制数。 格式: str=dec2base(d,base) str=dec2base(d,base,n) 说明: dec2base是base2dec函数的逆函数,str=dec2base(d,base)可将十进制数d变换成任意进制(由base指定)数的字符串,base为从2到36之间的整数,d应是非负整数,且其值小于252。
str=dec2base(d,base,n)表示产生的str至少为n位,如不足n位则在左边补0。例如输入 2021 >> str2=dec2base(61,3,6) str2 = 002021 >> str3=dec2base(61,16) str3 = 3D
8.str2double 功能:将字符串变换成双精度数。 格式: x = str2double('str') X = str2double(C) 说明: X = str2double('str')可以将字符串str转换成双精度数,其中str应该是以实数或复数的ASCII码,str中可以包含数字、小数点、逗号(千位分隔符)、前置的+/-号、e(10的幂指数)、i(复数单位)等。如果str表示的数值无效,则str2double返回NaN。
X = str2double(C)可以将字符串单元阵列C转换成双精度数,矩阵X的尺寸与C相同。 例如: >> str2double('123 + 45i') ans = 1.2300e+002 +4.5000e+001i >> str2double({'2.71' '3.1415'}) 2.7100 3.1415
习 题 1.将下列数值变换成字符串: 78,-56.1,0.00015,π,251.7×15.79 习 题 1.将下列数值变换成字符串: 78,-56.1,0.00015,π,251.7×15.79 2.将下列十进制数分别变换成二进制、八进制和十六进制数(负数用补码表示)。 271,-45,78,56.125,-79.1248 3.在x∈[-1, 1]之间绘制出y=−2x2+4曲线,并在图中标注出最大值点的坐标。如果另有一条曲线z=-2x2+4+sin(2πx),请在同一个图形窗口中绘制出这两条曲线,并加上极值点的标注。
4.任意给出一个英语句子,请提取其中的单词,并设计一个结构,其域有Name、no、length、value,分别用于存储每个单词的名称、句中序号、单词长度、单词各字符的ASCII码之和。 5.产生汉字第一区中所有的汉字(每个汉字占用两个代码,一个表示区号,另一个表示位号,简称区位码。汉字内码为在区位号基础上加上A0A0H,H表示十六进制,汉字从第16区开始存放,位号为1~94。比如第一个汉字“阿”的区位码为1601,其内码为B0A1H,因此利用char函数可自动产生汉字字符集)。
6.有一个至多为255个字符的字符串,开始部分可能包含有一些空格,在字符串中间或末尾肯定包含有字符'#',要求取出从第一个非空格字符开始到'#'之间的所有字符(不含 '#'),并计算出其字串的长度。 7.任意找一篇英文文章,要求统计出字符a~z出现的频率度,并画出频度曲线。
8.在网页设计原文件中,用一对< title >< /title >括起表示标题,类似的成对标记还有 < body >< /body >,编写程序实现查找这两种标记出现的次数,并分别统计包含在成对标记中的字符个数。 9.对任意一段英文文章,参照书中7.6节综合示例的要求完成设计。