14字符串数组、元胞数组与构架数组4.1字符串数组4.1.1字符串入门【*例4.1.1-1】先请读者实际操作本例,以体会数值量与字符串的区别。clear%清除所有内存变量a=12345.6789%给变量a赋数值标量class(a)%对变量a的类别进行判断a_s=size(a)%数值数组a的“大小”a=1.2346e+004ans=doublea_s=11b='S'%给变量b赋字符标量(即单个字符)class(b)%对变量b的类别进行判断b_s=size(b)%符号数组b的“大小”b=Sans=charb_s=11whos%观察变量a,b在内存中所占字节NameSizeBytesClassa1x18doublearraya_s1x216doublearrayans1x48chararrayb1x12chararrayb_s1x216doublearrayGrandtotalis10elementsusing50bytes4.1.2串数组的属性和标识【*例4.1.2-1】本例演示:串的基本属性、标识和简单操作。(1)创建串数组a='Thisisanexample.'a=Thisisanexample.(2)串数组a的大小size(a)ans=1192(3)串数组的元素标识a14=a(1:4)%提出一个子字符串ra=a(end:-1:1)%字符串的倒排a14=Thisra=.elpmaxenasisihT(4)串数组的ASCII码ascii_a=double(a)%产生ASCII码ascii_a=Columns1through128410410511532105115329711032101Columns13through191209710911210810146char(ascii_a)%把ASCII码变回字符串ans=Thisisanexample.(5)对字符串ASCII码数组的操作%使字符串中字母全部大写w=find(a='a'&a='z');%找出串数组a中,小写字母的元素位置。ascii_a(w)=ascii_a(w)-32;%大小写字母ASCII值差32.用数值加法改变部分码值。char(ascii_a)%把新的ASCII码翻成字符ans=THISISANEXAMPLE.(6)中文字符串数组A='这是一个算例。';%创建中文字符串A_s=size(A)%串数组的大小A56=A([56])%取串的子数组ASCII_A=double(A)%获取ASCII码A_s=17A56=算例ASCII_A=Columns1through6547545191153947473505219549405Column741379char(ASCII_A)%把ASCII码翻译成字符ans=这是一个算例。(7)创建带单引号的字符串b='Example''4.1.2-1'''b=Example'4.1.2-1'(8)由小串构成长串3ab=[a(1:7),'',b,'.']%这里第2个输入为空格串ab=ThisisExample'4.1.2-1'.4.1.3复杂串数组的创建4.1.3.1多行串数组的直接创建【*例4.1.3.1-1】多行串数组的直接输入示例。clearS=['Thisstringarray''hasmultiplerows.']S=Thisstringarrayhasmultiplerows.size(S)ans=2184.1.3.2利用串操作函数创建多行串数组【*例4.1.3.2-1】演示:用专门函数char,str2mat,strvcat创建多行串数组示例。S1=char('Thisstringarray','hastworows.')S1=Thisstringarrayhastworows.S2=str2mat('这','字符','串数组','由4行组成')S2=这字符串数组由4行组成S3=strvcat('这','字符','串数组','','由4行组成')%“空串”会产生一个空格行S3=这字符串数组由4行组成size(S3)ans=554.1.3.3转换函数产生数码字符串【*例4.1.3.3-1】最常用的数组/字符串转换函数int2str,num2str,mat2str示例。(1)int2str把整数数组转换成串数组(非整数将被四舍五入园整后再转换)A=eye(2,4);%生成一个)42(数值数组A_str1=int2str(A)%转换成)102(串数组。请读者自己用size检验。A_str1=100040100(2)num2str把非整数数组转换为串数组(常用于图形中,数据点的标识)rand('state',0)B=rand(2,4);%生成数值矩阵B3=num2str(B,3)%保持3位有效数字,转换为串B3=0.950.6070.8910.4560.2310.4860.7620.0185(3)mat2str把数值数组转换成输入形态的串数组(常与eval指令配用)B_str=mat2str(B,4)%保持4位有效数字,转换为“数组输入形式”串B_str=[0.95010.60680.89130.4565;0.23110.4860.76210.0185]Expression=['exp(-',B_str,')'];%相当于指令窗写一个表达式exp(-B_str)eval(Expression)%把exp(-B_str)送去执行ans=0.38670.54510.41010.63350.79370.61510.46670.9817【*例4.1.3.3-2】综合例题:在MATLAB计算生成的图形上标出图名和最大值点坐标。clear%清除内存中的所有变量a=2;%设置衰减系数w=3;%设置振荡频率t=0:0.01:10;%取自变量采样数组y=exp(-a*t).*sin(w*t);%计算函数值,产生函数数组[y_max,i_max]=max(y);%找最大值元素位置t_text=['t=',num2str(t(i_max))];%生成最大值点的横坐标字符串7y_text=['y=',num2str(y_max)];%生成最大值点的纵坐标字符串8max_text=char('maximum',t_text,y_text);%生成标志最大值点的字符串9%生成标志图名用的字符串tit=['y=exp(-',num2str(a),'t)*sin(',num2str(w),'t)'];%11plot(t,zeros(size(t)),'k')%画纵坐标为0的基准线holdon%保持绘制的线不被清除plot(t,y,'b')%用兰色画y(t)曲线plot(t(i_max),y_max,'r.','MarkerSize',20)%用大红点标最大值点text(t(i_max)+0.3,y_max+0.05,max_text)%在图上书写最大值点的数据值16title(tit),xlabel('t'),ylabel('y'),holdoff%书写图名、横坐标名、纵坐标名0246810-0.100.10.20.30.40.50.6maximumt=0.33y=0.4321y=exp(-2t)*sin(3t)ty5图4.1.3.3-1字符串运用示意图4.1.3.4利用元胞数组创建复杂字符串【*例4.1.3.4-1】元胞数组在存放和操作字符串上的应用。a='MATLAB5';b='introducesnewdatatypes:';%创建单行字符串a,bc1='◆Multidimensionalarray';c2='◆User-definabledatastructure';c3='◆Cellarrays';c4='◆Characterarray';c=char(c1,c2,c3,c4);%创建多行字符串cC={a;b;c};%利用元胞数组存放长短不同的字符串5disp([C{1:2}])%显示前两个元胞中的字符内容6disp('')%显示一行空白disp(C{3})%显示第3个元胞中的字符内容8MATLAB5introducesnewdatatypes:◆Multidimensionalarray◆User-definabledatastructure◆Cellarrays◆Characterarray4.1.4串转换函数【*例4.1.4-1】fprintf,sprintf,sscanf的用法示例。rand('state',0);a=rand(2,2);%产生)22(随机阵s1=num2str(a)%把数值数组转换为串数组s_s=sprintf('%.10e\n',a)%10数位科学记述串,每写一个元素就换行。s1=0.950130.606840.231140.48598s_s=9.5012928515e-0012.3113851357e-0016.0684258354e-0014.8598246871e-001fprintf('%.5g\\',a)%以5位数位最短形式显示。不能赋值用0.95013\0.23114\0.60684\0.48598\s_sscan=sscanf(s_s,'%f',[3,2])%浮点格式把串转换成成)23(数值数组。s_sscan=0.95010.48600.231100.606804.1.5串操作函数4.2元胞数组4.2.1元胞数组的创建和显示64.2.1.1元胞标识寻访和内容编址寻访的不同4.2.1.2元胞数组的创建和显示【*例4.2.1.2-1】本例演示:)22(元胞数组的创建。C_str=char('这是','元胞数组创建算例1');%产生字符串R=reshape(1:9,3,3);%产生)33(实数阵RCn=[1+2i];%产生复数标量S_sym=sym('sin(-3*t)*exp(-t)');%产生符号函数量(1)直接创建法之一:“外标识元胞元素赋值法”A(1,1)={C_str};A(1,2)={R};A(2,1)={Cn};A(2,2)={S_sym};A%显示元胞数组A=[2x10char][3x3double][1.0000+2.0000i][1x1sym](2)直接创建法之二:“编址元胞元素内涵的直接赋值法”B{1,1}=C_str;B{1,2}=R;B{2,1}=Cn;B{2,2}=S_sym;celldisp(B)%显示元胞数组内容B{1,1}=这是元胞数组创建算例1B{2,1}=1.0000+2.0000iB{1,2}=147258369B{2,2}=-sin(3*t)*exp(-t)4.2.2元胞数组的扩充、收缩和重组【*例4.2.2-1】元胞数组的扩充。(1)利用cell指令创建元胞数组C=cell(2);%预设)22(空元胞数组C(:,1)={char('Another','textstring');10:-1:1}%对第一列元胞赋值C=[2x11char][][1x10double][](2)元胞数组的“列”扩充和“行”扩充AC=[AC]%空格(或逗号)利用来分隔列A_C=[A;C]%分号利用来分隔“行”AC=[2x10char][3x3double][2x11char][][1.0000+2.0000i][1x1sym][1x10double][]A_C=[2x10char][3x3double][1.0000+2.0000i][1x1sym][2x11char][]7[1x10double][]【*例4.2.2-2】cellplot能用图形形象化地表示元胞数组的内容。(A_C取自上例)cellplot(A_C,'legend')1+2idoublecharsparsestructureother图4.2.2-1元胞数组A_C的形象化结构图【*例4.2.2-3】元胞数组的收缩和重组。(1)元胞数组的收缩A_C(3,:)=[]%删除第3行,使A_C成为)23(的元胞数组A_C=[2x10char][3x3double]