马新生南昌大学数学系字符与字符串CUMCM暑期培训2007,7NCUMCM暑期培训简介本章介绍MATLAB用于处理字符(Characters)与字符串(Strings)的指令及相关数据型态。MATLAB处理字符串的相关指令大部分都放在下列目录之中:{MATLAB根目录}\toolbox\matlab\strfun其中的「strfun」就是代表「StringFunctions」。若要查询与字符和字符串相关的指令,可在MATLAB下输入:helpstrfun或是helpstringsNCUMCM暑期培训1字符与字符串的基本概念数个字符(Characters)可以构成一个字符串(Strings)一个字符串是被视为一个列向量(RowVector)进行储存此一字符串中的每一字符(含空格符),是以其ASCII码的形式存放于此列向量中的每一个元素(Element)NCUMCM暑期培训字符与字符串的基本概念Matlab用「单引号」来界定字符串变量,多个字符串变量可直接并排,以得到一个新字符串变量,例如:范例10-2:string102.mstr3=IlikeMATLAB,JavaScript,andPerl!str1='IlikeMATLAB,';%建立字符串变量str1str2='JavaScript,andPerl!';%建立字符串变量str2str3=[str1str2]%直接并排str1及str2,以建立str3NCUMCM暑期培训字符与字符串的基本概念欲输入含有单引号的字符串,可重复单引号的使用若要计算字符串变量的长度(即组成字符的个数),可用length指令范例10-4:string104.mans=16sentence='I''vegotadate!';length(sentence)%计算字符串变量sentence的长度NCUMCM暑期培训字符串和其ASCIIcodedouble指令:检视字符串变量的储存内容(即ASCII内码)char指令:将ASCII内码转回字符串形式范例10-6:string106.mphraseascii=Columns1through12733911810132103111116329732100Columns13through169711610133sentence2=I'vegotadate!sentence='I''vegotadate!';sentenceAscii=double(sentence);%检视sentence的ASCII码sentence2=char(sentenceAscii)%将ASCII码转回字符串形式NCUMCM暑期培训字符的储存无论是中文或英文,每一个字符都会占用两个字节(2Bytes),故在上页中,字符串变量sentence总共由16个字符构成,占用的内存总计为三十二个字节(32bytes)whos指令:检视字符串变量sentence所占用储存空间(whos变量)MATLAB是以两个字节来储存一个字符,所以也可以支持Big5的中文码,而且Big5中文的ASCII内码都会大于数字128由于MATLAB将字符串以其相对应之ASCII内码(即数字形式)储存成一列向量,故若对此字符串直接进行数值运算,MATLAB会先将此字符串转成数值,再进行一般数值向量的运算NCUMCM暑期培训字符与字符串的基本概念-evaleval指令:直接“执行”某一特定字符串,其效果就如同直接在MATLAB指令窗口内输入此一特定字符串eval指令特别适用于在for-loop内自动产生有规律的变量名称范例10-11:string111.mNameSizeBytesClassx33x372doublearrayx44x4128doublearrayx55x5200doublearrayx66x6288doublearrayGrandtotalis86elementsusing688bytesx3,x4,x5,x6都是在for-loop中产生的变量,分别代表维度为3×3、4×4、5×5、6×6的魔方阵clearall%清除所有变量fori=3:6eval(['x',int2str(i),'=magic(',int2str(i),');']);endwhosx*NCUMCM暑期培训字符串的判断class或ischar指令:判断某一个变量是否为字符串范例10-12:string112.m字符串变量所占用的空间是同长度双精准(Double)数值变数的四分之一chinese='今日事,今日毕';out1=class(chinese)%out1的值是“char”,代表chinese是字符串变量x=chinese+1;out2=ischar(x)%out2的值是0,代表x不是一个字符串变量NCUMCM暑期培训2一个变量来储存多个字符串第一种方法是使用二维字符数组(TwoDimensionalCharacterArrays)必须先确认每个字符串(即每一横列)的长度一样,否则就必须在短字符串结尾补上空格符范例10-13:string201.mdepartments=eecsecondepartments=['ee';'cs';'econ']%注意空格符的使用NCUMCM暑期培训一个变量来储存多个字符串用char指令储存多个字符串得到结果和前一个范例依样;从二维字符数组抽取出字符串时,切记要使用deblank指令来移除尾部的空格符范例10-15:string203.m.departments=char('ee','cs','econ')%注意「()」及「,」的使用departments=char('ee','cs','econ');dept1=departments(1,:);%(1,:)代表第一列的元素dept2=deblank(dept1);%使用deblank指令来移除尾部的空格符len1=length(dept1)%显示变量dept1的长度=4len2=length(dept2)%显示变量dept2的长度=2NCUMCM暑期培训一个变量来储存多个字符串当字符串的长度差异甚大,那么使用二维字符数组来储存多个字符串,将造成内存空间的浪费,怎么办?「异质数组」:使用大括号框住多个字符串,或用cellstr指令将字符数组转换成异质数组(string204.m,string205.m)若要将包含字符串的异质数组转换成一般的二维字符数组,还是可以使用char指令NCUMCM暑期培训3字符串的比较、寻找、代换、分解与结合strcmp指令:用于比较字符串内容的异同范例10-19:string301.m不相等回传0,相等回传1DIFFERENTtoCstr1='today';str2='tomorrow';str3='today';out1=strcmp(str1,str2)%比较两字符串str1和str2=0out2=strcmp(str1,str3)%比较两字符串str1和str3=1NCUMCM暑期培训字符串的比较和寻找strncmp指令:用于比较字符串的前n个字符strcmp及strncmp指令亦可用于字符串异质数组findstr指令:寻找在某一个长字符串中的子字符串(Substrings),并传回其起始位置strrep指令:用于字符串寻找及代换,例如:newString=strrep(string,pattern,pattern2)NCUMCM暑期培训字符串的分解strtok指令:根据一给定的分界字符(DelimitingCharacters),将一字符串拆解成数个字符串,预设分界字符为空格符strvcat指令:将拆解下来的字符串内容(即储存在字符串变量chopped中)加到二维字符数组parsed中范例10-24:string306.mparsed=eecseconstatmeinput_string='eecseconstatme';remainder=input_string;parsed='';%建立一空字符数组while(any(remainder))[chopped,remainder]=strtok(remainder);parsed=strvcat(parsed,chopped);endparsedNCUMCM暑期培训字符串的结合MATLAB在读入中文字符串时,将每一个中文字的2-byte分开来读,造成两个中文字变成四个字符串元素xlate指令:将中文的2-byte「结合」在一起范例10-27:string309.mline2=我是Rogerans=7fid=fopen('tbig5.txt');line=fgetl(fid);%读取一列档案内容fclose(fid);line2=xlate(line)%使用xlate将被猜开的中文结合在一起leng=length(line2)%显示字符串长度NCUMCM暑期培训10-4字串、数值与数组的转换int2str指令:将整数型态的数据转换成字符串数据例如:y=int2str(x),x为整数,y为字符串num2str指令:将实数转为字符串dec2hex指令:将10进位数值数据转换成16进位的字符串表示法更多类似指令如:hex2num,hex2dec,bin2dec….NCUMCM暑期培训字符串数组的转换mat2str指令可将矩阵转换为字符串,此字符串若再经由eval指令的使用,可再变回原先的矩阵范例10-32:string405.mB=[121;356]ans=1A=[121;356];B=mat2str(A)%将矩阵A转成字符串BA2=eval(B)%再将字符串B转回矩阵A2isequal(A,A2)%测试A和A2是否相等NCUMCM暑期培训字串与数值的结合sprintf指令:结合数值或字符串,以产生新字符串(%s-印出字符串,%g-印出数值,可使用%f或加上控制印出位数大小的数字)范例10-33:string406.mnewString=「圆周率」是3.14159sscanf可依给定的格式来解析出所要的字符串或数值范例10-34:string407.mmat=2.00004.70005.2000str='圆周率';newString=sprintf('「%s」是%g',str,pi)str='24.75.2';mat=sscanf(str,'%f')