《字符串数组元胞数组和构架数组.pptx》由会员分享,可在线阅读,更多相关《字符串数组元胞数组和构架数组.pptx(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、13.1 字符串数组(Character String Array)【例31】字符串入门 String1=b;String2=This is an example!;%英文字母、空格、数字、标点、中文字符String3=例子char array;%都是占一个元素位,两个字节s1=class(String1)s1=chars2=size(String2)s2=1 19 whos Name Size Bytes Class String1 1x1 2 char array String2 1x19 38 char array String3 1x14 28 char array s1 1x4 8
2、char array s2 1x2 16 double arrayGrand total is 40 elements using 92 bytesl 在MATLAB中,字符串是作为字符数组来引入的;l 一个字符串由多个字符组成,用单引号()来界定;l 字符串是按行向量进行存储的,每一字符(包括空格)是以其ASCII码的形式存放.。第1页/共33页23.1.1 字符串数组的属性和标识 1.创建串数组 必须将待建字符放在“单引号对”中,当串中本身包含单引号时,每个单引号符用“连续的两个单引号”表示。2.串数组的大小 size指令可获得串数组的大小。串中的每一个字符,包括中英文字符、空格、标点都算
3、一个元素。3.串数组的元素标识按从左至右的顺序依次用1、2、3、4等标识元素在串中的位置。4.串数组的ASCII码 指令abs和double可以显示串数组对应的ASCII码数值数组,指令char则可把ASCII码数值数组转换成串数组。5.字符串ASCII码数组的操作 可以对ASCII码数组进行数值数组的各种运算。但其结果就变成一般数值向量的运算,而不再是字符串的运算。注意:l 必须在英文状态下输入“单引号对”。l 将多个字符串变量直接用“,”连接,可构成一个较长的新字符串变量。第2页/共33页3【例32】串数组基本操作 string=this is an example!%输入字符串strin
4、gstring=this is an example!s_1=string(end:-1:1)%倒序排列string得到s_1s_1=!elpmaxe na si siht s_2=string(end:-2:1)%倒序排列string且每隔一个字符取一个元素得到s_2s_2=!lmx as it w=string=a&string STRING=string;%定义新串STRING,其内容与string相同 STRING(w)=char(string(w)-32)%将小写字符转换成大写字符(ASCII码相差32)STRING=THIS IS AN EXAMPLE!Str=Exm03_2.m,
5、string(5:end)%构造新的字符串StrStr=Exm03_2.m is an example!第3页/共33页43.1.2 复杂字符串数组的创建 1.多行串数组的直接创建多行串数组的直接创建必须保证各行等长,可以利用增减“空格”来实现。s=Hello,6个字符 Nice to meet you!17个字符?Error using=vertcatAll rows in the bracketed expression must have the same number of columns.s=Hello,*ones(1,11)补充11个空格 Nice to meet you!s=He
6、llo,Nice to meet you!size(s)ans=2 17 2.利用串操作函数创建多行串数组 利用专门的str2mat、strvcat和char函数可以构造出字符串数组,而不必考虑每行的字符数是否相等,总是按最长的设置,不足的末尾用空格补齐。s=char(Hello,Nice to meet you!);s=str2mat(Hello,Nice to meet you!);s=strvcat(Hello,Nice to meet you!);s=Hello,Nice to meet you!第4页/共33页5 s1=str2mat(Hello,Nice to meet you!)
7、;s2=strvcat(Hello,Nice to meet you!);s1,s2 s_s=size(s),s_s1=size(s1),s_s2=size(s2)s_s=2 17s_s1=3 17s_s2=2 17s1=s2=Hello,Hello,Nice to meet you!Nice to meet you!区别:str2mat认为空串代表空行;strvcat省略空串。3.利用串转换函数产生数码字符串 常用的数组/字符串转换函数有int2str,num2str,mat2str。l int2str:把整数数组转换成字符串数组,非整数将被四舍五入后再转换;l num2str:把非整数数组
8、转换成字符串数组,常用于图形中数据点的标识;l mat2str:把数值数组转换成字符串数组。a=0.9576 0.8 2.151;4.0 5 7.8;23数值数组 a1=int2str(a);%取整数 a2=num2str(a,2);保持2位有效数字,转换为串 a3=mat2str(a,2);保持2位有效数字,转换为一行串a,a1,a2,a3第5页/共33页6%清除内存变量%时间 t 从 0 到 10 每隔 0.01 均匀采样%对应每一个 t 求 y 值%求最大值 y_max 及其下标 i_max%生成最大值点的横坐标字符串%生成最大值点的纵坐标字符串%三行字符来标识最大值点%图名称字符串%新
9、建一个图形窗%画一条黑色的水平线%保持图形不被清除%蓝色实线画曲线 y(t)%大小为 20 的红色圆点标记最大值点%在最大值点附近显示注释字符%显示图名%显示横坐标名%显示纵坐标名%取消图形保持a=0.9576 0.8000 2.1510 4.0000 5.0000 7.8000a1=1 1 24 5 8a2=0.96 0.8 2.2 4 5 7.8a3=0.96 0.8 2.2;4 5 7.8【例33】作出函数y=e-2tsin(3t)的图形,并标注最大值点cleart=0:0.01:10;y=exp(-2*t).*sin(3*t);y_max,i_max =max(y);t_text=t=
10、,num2str(t(i_max);y_text=y=,num2str(y_max);max_text=char(Maxium,t_text,y_text);Title=y=exp(-2*t).*sin(3*t);Figureplot(t,zeros(size(t),k)hold onplot(t,y,b)plot(t(i_max),y_max,r.,MarkerSize,20)text(t(i_max)+0.3,y_max+0.05,max_text)title(Title);xlabel(t)ylabel(y)hold off第6页/共33页7第7页/共33页83.1.3 串转换函数和串操
11、作函数1.字符串转换函数(详见P76表3.1-1)指指 令令含含 义义指指 令令含含 义义abs把串译成ASCII码base2decbase,bin,hex与dec之间的转换。base:任意进制串bin:二进制串hex:十六进制串dec:十进制整数char任意类型转换成串bin2decdouble任意类型转换成双精度数值hex2decfprintf格式化数据写到文件或屏幕dec2basesprintf以控制格式把数值转换为串dec2binsscanf在格式控制下把串转换成数值dec2hexsetstr把ASCII码译成串int2str整数转换成串str2num串转换成数值mat2str数值矩阵
12、转换成串hex2num十六进制串转换成浮点数num2str数值转换成串2.字符串操作函数(详见P77表3.1-2)l length:用来计算字符串的长度(即组成字符的个数)。l char(s1,s2,):将串s1,s2,逐个写成行,形成多行数组。l class或ischar:用来判断某一个变量是否为字符串。class函数返回char则表示为字符串,而ischar函数返回1表示为字符串。第8页/共33页9l strcmp(s1,s2):比较字符串s1和s2是否相同。返回值如果为1则相同,为0则不同。l findstr(s1,s2):寻找在某个长字符串s1中的子字符串s2,返回其起始位置。l de
13、blank(s):删除字符串尾部的空格。str1=Hello;str2=I like MATLAB%重复单引号来输入含有单引号的字符串 str2=I like MATLAB length(str2)%字符串str2的长度 ans=15 x1=double(str1)%查看字符串str1的ASCII码x1=72 101 108 108 111 x2=str1+1%字符串的数值运算x2=73 102 109 109 112 char(x1)%将ASCII码转换成字符串形式ans=Hello char(x2)ans=Ifmmp第9页/共33页10 char(str1,str2)形成两行字符ans=H
14、ello I like MATLAB strcat(str1,!,str2,.)形成一长串ans=Hello!I like MATLAB.strcmp(str1,str2)比较两串是否相同ans=0 findstr(str2,like)寻找子串like的起始字符在主串中的下标ans=3 isletter(str2)%以逻辑1指示串中英文字母的位置ans=Columns 1 through 12 1 0 1 1 1 1 0 0 1 1 1 1 Columns 13 through 15 1 1 0 class(str1),class(x1),判断变量类型ans=charans=double第10
15、页/共33页11l 执行字符串 如果需要直接“执行”某一字符串,可以使用eval命令,效果就如同直接在MATLAB命令窗口内输入此命令。str3=a=2*5str3=a=2*5 eval(str3)%执行字符串a=10l 显示字符串 字符串可以直接使用disp命令显示出来,即使后面加分号(;)也显示。disp(请输入2*2的矩阵a)请输入2*2的矩阵a disp(char(str1,str2);Hello I like MATLABstr1=Hello ,str2=I like MATLABstr1=Hellostr2=I like MATLAB第11页/共33页123.2元胞数组(Cell
16、Array)特点:l 元胞数组的基本组成单元是元胞(cell),元胞在数组中以下标来进行区分;l 元胞可以是任何类型、任意大小的数组(如:数值数组、字符串数组、符号对象等);l 一个元胞数组中各个元胞可以是不同类型的内容;l 元胞数组的维数不受限制,可以采用单下标或全下标寻址;l 元胞和元胞里的内容是两个不同范畴的东西,分别通过“元胞外标识(Cell Indexing)”和”元胞内编址(Content Addressing)”来寻访。“外标识的元胞元素”用圆括号对(),而“编址元胞元素内涵”用花括号对,如A(2,3)表示元胞数组A第2行第3列的元胞,A2,3则表示元胞数组A第2行第3列的元胞中
17、的内容。3.2.1 元胞数组的创建1.直接使用花括号创建 clearA=This is the first Cell.,1 2;3 4;eye(3),Tom,JaneA=1x23 char 2x2 double 3x3 double 1x2 cell 创建的元胞数组中的元胞A(1,1)是字符串,A(1,2)是数组,A(2,1)是数组,而A(2,2)为一个元胞数组。whos Name Size Bytes Class A 2x2 524 cell arrayGrand total is 49 elements using 524 bytes第12页/共33页132.由各元胞创建外标识元胞元素赋值
18、法 B(1,1)=This is the second Cell.;B(1,2)=5+3*i;B(1,3)=1 2;3 4;5 6;B 显示元胞数组B=1x24 char 5.0000+3.0000i 3x2 double3.由各元胞内容创建 编址元胞元素内涵的直接赋值法 C1,1=This is the third Cell.;C2,1=magic(4)生成21的元胞数组C=This is the third Cell.4x4 double3.2.2 元胞数组 的内容显示 在MATALB命令窗口中输入元胞数组的名称,并不直接显示出元胞数组的各元胞元素的内容值,而是显示各元胞元素的数据类型和结
19、构,单元素的元胞除外。1.使用celldisp命令显示元胞数组的内容 A1,1=This is the first Cell.A2,1=1 0 0 0 1 0 0 0 1A1,2=1 2 3 4A2,21=TomA2,22=Jane celldisp(A),celldisp(C)C1=This is the third Cell.C2=16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1表示元胞数组的元胞元素内容,A2,21表示第2行第2列的元胞元素中存放的元胞数组的第1个元胞元素的内容 第13页/共33页142.使用cellplot命令以图形显示元胞数组的内容 cel
20、lplot(A)3.2.3 元胞数组的内容获取 1.取元胞数组的元素内容 x1=A1,2%用花括号寻访取A(1,2)元胞元素的内容 x1=1 2 3 4 第14页/共33页15【例34】元胞数组的基本应用C=char(这是,元胞数组);%两行的字符串数组R=reshape(1:9,3,3);%33 的数值数组S=sym(sin(-3*t)*exp(-t);%符号表达式A(1,1)=C;%对元胞数组 A 进行赋值A 2,1 =S;%注意 和()的区别 当用圆括号来寻址时,所表示的是元胞,相应地等号右边也应该是一个元胞;当用花括号来寻址时,所表示的是元胞中的内容,可以是任意类型、大小的数组。x2=
21、A1,2(2,2)%取A(1,2)元胞元素的数组第二行第二列内容x2=4 2.取元胞数组的元素 x3=A(1,2)用圆括号寻访得到的是元胞x3=2x2 double 3.使用deal函数取多个元胞元素的内容 x4,x5,x6=deal(A2,3,4)单下标寻址取A的三个元胞内容x4=1 0 0 0 1 0 0 0 1x5=1 2 3 4x6=Tom Jane注意:x1是数组,x2是标量。第15页/共33页16 celldisp(A)%显示元胞数组 A 的元胞中的内容A1,1=这是 元胞数组A2,1=sin(-3*t)*exp(-t)A1,2=A2,2=1 4 7 2 5 8 3 6 9A 2,
22、2 =R;A%显示元胞数组 A 的元胞A=2x4 char 1x1 sym 3x3 double A 2,2 =RA=2x4 char 1x1 sym 1x1 cell celldisp(A)A1,1=这是 元胞数组A2,1=sin(-3*t)*exp(-t)A1,2=A2,21=1 4 7 2 5 8 3 6 9A 2,2 1(1,3)7考虑A 2,2 =R的情况:class(A(2,1)%元胞的类型ans=cell class(A2,1)%元胞的内容的类型ans=sym第16页/共33页17 A(2,1)%A 的第2行第1列的元胞ans=1x1 sym A 2,1%A 的第2行第1列的元胞
23、中的内容ans=sin(-3*t)*exp(-t)save exm03_04.mat 保存内存变量3.2.4 元胞数组的扩充、收缩和重组【例35】元胞数组的扩充、收缩和重组 clearload exm03_04%载入数据文件B=cell(2);%创建空的 22 元胞数组B 1,1 =Another cell array;%对元胞数组进行赋值B(:,2)=num2str(R);1+2i%对第二列元胞赋值,注意前后大小一致B=Another cell array 3x7 char 1.0000+2.0000i元胞数组的重组 AB=A B%将 A,B 作为两列排列得到 24 的元胞数组AB=2x4
24、char Another cell array 3x7 char 1x1 sym 3x3 double 1.0000+2.0000i第17页/共33页18 A_B=A;B%将 A,B 作为两行排列得到 4*2 的元胞数组A_B=2x4 char 1x1 sym 3x3 double Another cell array 3x7 char 1.0000+2.0000icellplot(A_B,legend)%元胞数组的形象结构图%元胞数组的收缩 A_B(3,:)=%删除元胞数组的第 3 行A_B=2x4 char 1x1 sym 3x3 double 1.0000+2.0000i RA_B=re
25、shape(A_B,2,3)%重新排列元胞数组的内容,得到 23 的元胞数组RA_B=2x4 char 3x3 double 1x1 sym 1.0000+2.0000i元胞数组内容的获取 A_B(2,2)%取出 A_B 中的一个元胞ans=3x3 double第18页/共33页19 A_B 2,2%取出该元胞的所有内容ans=1 4 7 2 5 8 3 6 9 A_B 2,2 (2,:)%取出该元胞中第 2 行的所有元素ans=2 5 8 a1,a2 =deal(A_B 1,2 )%一次取出多个元胞,并逐个分配a1=这是 元胞数组a2=sin(-3*t)*exp(-t)a3=A_B2,2(:
26、,1,3)%取出第 2 行第2列元胞内容中的第1,3列 a3=1 7 2 8 3 9注意:花括号、圆括号和中括号在寻址时的不同含义第19页/共33页203.3 构架数组(Structure Array)特点:l 构架数组的基本组成是构架(Structure),以下标区分各个构架;l 构架必须划分成“域”后才能使用,每一个构架都包含多个域(Fields);l 构架不能直接存放数据,数据必须存放在构架下面的“域”中;l 构架的域可以存放任意类型、任意大小的数组(数值数组、字符串数组、符号对象、元胞等);l 不同构架的同名域中可以存放不同类型的内容;l 构架数组可以是任意维的,可以利用单下标或全下标
27、寻址。3.3.1 构架数组的创建 1.直接创建法直接对域赋值ps(1).name=曲线1;%构架的域由(构架名).(域名)标识ps(1).color=red;ps(1).position=0,0,300,300;ps(2).name=曲线2;ps(2).color=blue;ps(2).position=100,100,300,300;l ps是构架数组,ps(1)和ps(2)是构架,name、color和position是域。第20页/共33页21ps ps为12的构架数组,有三个域ps=1x2 struct array with fields:name color position ps(
28、1)显示构架ans=name:曲线1 color:red position:0 0 300 3002.利用struct函数创建 ps(1)=struct(name,曲线1,color,red,position,0,0,300,300);ps(2)=struct(name,曲线2,color,blue,position,100,100,300,300)ps=1x2 struct array with fields:name color position3.3.2 构架数组数据的获取和设置 1.直接获取 x1=ps(1)获取一个构架x1=name:曲线1 color:red position:0
29、0 300 300第21页/共33页22 x2=ps(1).position 获取构架ps(1)中一个域position的全部内容x2=0 0 300 300 x3=ps(1).position(1,3)获取构架ps(1)position域中第1行第3列的元素内容x3=3002.用getfield获取构架数组的数据 x4=getfield(ps,1,color)获取构架ps(1)中一个域color的全部内容x4=red x5=getfield(ps,1,color,1)获取构架ps(1)color域中第一个元素的内容x5=r3.用setfield设置构架数组的数据 ps=setfield(ps
30、,1,color,green);%对ps(1)中color域的内容进行设置 ps(1)ans=name:曲线1 color:green position:0 0 300 300第22页/共33页233.3.3 构架数组域的获取1.使用fieldnames获取构架数组的所有域 x6=fieldnames(ps)x6=name color position2.获取构架数组域的数据 l 使用“”合并相同域的数据并排成水平向量 all_x=ps.nameall_x=曲线1曲线2l 使用cat将其变成多维数组 cat(1,ps.position)%沿第一维排列ans=0 0 300 300 100 10
31、0 300 300 cat(2,ps.position)%沿第二维排列ans=0 0 300 300 100 100 300 300第23页/共33页24【例36】已知2输入2输出的LTI系统的传递函数,利用表示该传递函数的构架数组来练习构架数组的基本操作。%1.创建代表 2 输入 2 输出系统的传递函数的构架数组clearnum=3,2;4 1,1;%分子系数构成的元胞数组den=1,3,2,1,1,1;1 2 2 1,1 0;%分母系数构成的元胞数组%2.获取构架数组的域名FN=fieldnames(SST)%获取域名,以元胞数组的形式保存FN=num den Variable ltiSS
32、T=struct(ss)%将传递函数矩阵转换成构架数组SST=num:2x2 cell den:2x2 cell Variable:s lti:1x1 ltiss=tf(num,den);%利用控制工具箱函数产生传递函数矩阵第24页/共33页25 class(FN)ans=cell%3.获取构架数组域中的内容ff=SST.den%获取 SST 的 den 域中的所有内容,为 22 的元胞数组ff=1x3 double 1x3 double 1x4 double 1x2 double ff 2,1%获取 ff 中第 2 行第1列中内容,相当于 SST.den2,1ans=1 2 2 1 poly
33、2str(ff2,1,s)%以易读形式显示多项式ans=s3+2 s2+2 s+1%4.赋值操作SST.num 2,1 ans=0 0 4 1SST.num 2,1 =1 3 1;%对 SST 的 num 域中第2行第1列的元胞内容进行修改 SST.num 2,1 ans=1 3 1第25页/共33页26%5.构架数组的扩充size(SST)%SST为单构架数组ans=1 1 SST(2,2)=struct(tf(1,1 1)%将 SST 扩充为 22 的构架数组SST=2x2 struct array with fields:num den Variable lti size(SST)ans
34、=2 2%6.构架数组的收缩SST(1,:)=%将 SST 构架数组的第 1 行删除SST=1x2 struct array with fields:num den Variable lti size(SST)ans=1 2num:2x2 cellden:2x2 cell Variable:slti:1x1 lti(1,1)num:2x2 cell den:2x2 cell Variable:s lti:1x1 lti(1,2)num:den:Variable:lti:(2,1)num:den:Variable:lti:(2,2)num:0 1 den:1 1 Variable:s lti:1
35、x1 lti扩充(1,1)num:den:Variable:lti:(1,2)num:0 1 den:1 1 Variable:s lti:1x1 lti收缩构架数组扩充、收缩示意图第26页/共33页27%7.构架数组内容的调取Snum=SST(1,2).num%取出 SST构架数组第1行第2列的构架的 num 域Snum=1x2 double Sden=SST(1,2).den%取出 SST构架数组第1行第2列的构架的 den 域Sden=1x2 double printsys(Snum1,Sden1,s)%利用系统函数打印函数显示 SST 的第1行第2列%的构架所代表的系统函数 num/d
36、en=1 -s+1Snum=SST(1,2).num1;%取出 SST构架数组第1行第2列的构架的 num 域的内容Sden=SST(1,2).den1;%取出 SST构架数组第1行第2列的构架的 den 域的内容printsys(Snum,Sden,s)num/den=1 -s+1第27页/共33页28【例37】其它命令 clear dept(5).No=5%生成 15 的构架数组,只有No域dept=1x5 struct array with fields:No dept(2).teacher=5%任一个构架增加 teacher 域,整个构架数组都增加 teacher 域dept=1x5
37、struct array with fields:No teacher dept(2).teacher.male=2;%增加一个构架的teacher域的子域,对其他构架没有影响dept(2).teacher.female=3dept=1x5 struct array with fields:No teacher dept(2).teacherans=male:2 female:3第28页/共33页29 dept(2).teacher=rmfield(dept(2).teacher,male)%删除子域对其他构架没影响dept=1x5 struct array with fields:No te
38、acher dept=rmfield(dept,teacher)%删除域对所有构架都有影响dept=1x5 struct array with fields:Nol 对构架数组增加或减少一个域会影响构架数组内所有的构架;l 对某一个构架的域增加或减少一个子域不会影响构架数组内的其它构架。3.4 数据类型归纳数组类型基本组分组分内容基本组分所占用byte数数值数组元素双精度实数标量双精度复数标量816字符串数组元素字符2元胞数组元胞可以存放任意类型、任意大小的数据不定构架数组构架只有构架的“域”可以存放数据,数据可以是任意类型、任意大小。不定第29页/共33页30【例38】构架数组和元胞数组之间
39、的转换 for k=1:5 dept(k).No=No.,int2str(k);dept(k).teacher=teacher,int2str(k);end%构造 15 构架数组,有No.域和teacher域 dept 显示构架数组的结构dept=1x5 struct array with fields:No teacher dept(3)显示第3个构架的结构ans=No:No.3 teacher:teacher3 DS=struct2cell(dept);%将构架数组转换成元胞数组DS(:,:,1)=No.1 teacher1DS(:,:,2)=No.2 teacher2DS(:,:,3)=
40、No.3 teacher3DS(:,:,4)=No.4 teacher4DS(:,:,5)=No.5 teacher5 size(DS)ans=2 1 5STRUCT2CELL Convert structure array to cell array.C=STRUCT2CELL(S)converts the M-by-N structure S(with P fields)into a P-by-M-by-N cell array C.If S is N-D,C will have size P SIZE(S).第30页/共33页31 Name=Class1;Class2;Class3;Cl
41、ass4;Class5;%给出域名字符串数组51 DF=cell2struct(DS,Name,3)%将元胞数组转换成构架数组,按第3维转换成域进行转换DF=2x1 struct array with fields:Class1 Class2 Class3 Class4 Class5 DF(1,1),DF(2,1)ans=Class1:No.1 Class2:No.2 Class3:No.3 Class4:No.4 Class5:No.5ans=Class1:teacher1 Class2:teacher2 Class3:teacher3 Class4:teacher4 Class5:teac
42、her5CELL2STRUCT Convert cell array to structure array.S=CELL2STRUCT(C,FIELDS,DIM)converts the cell array C into the structure S by folding the dimension DIM of C into fields of S.SIZE(C,DIM)must match the number of field names in FIELDS.FIELDS can be a character array or a cell array of strings.第31页/共33页32小结1)字符串数组的创建和标识 单引号对(英文状态下输入),复杂串数组的输入 英文字母、空格、数字、标点、中文字符都占一个元素位2)元胞数组的创建和标识 圆括号和花括号的区别 元胞可以是任何类型、任意大小的数组3)构架数组的创建和标识 构架必须划分成域 域和子域的改变对整个构架数组的影响 构架的域可以存放任何类型、任意大小的数组4)数据类型转换指令 int2str,mat2str,num2str,str2num,char,double,cell2struct,struct2cell第32页/共33页33感谢您的观看。第33页/共33页