MATLAB教案.ch04.字符串数组、元胞数组和构架数组.doc_第1页
MATLAB教案.ch04.字符串数组、元胞数组和构架数组.doc_第2页
MATLAB教案.ch04.字符串数组、元胞数组和构架数组.doc_第3页
MATLAB教案.ch04.字符串数组、元胞数组和构架数组.doc_第4页
MATLAB教案.ch04.字符串数组、元胞数组和构架数组.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

4 字符串数组、元胞数组和构架数组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 = 1 1 b=S %给变量b赋字符标量(即单个字符)class(b)%对变量b的类别进行判断 b_s=size(b)%符号数组b的“大小” b =Sans =charb_s = 1 1 whos%观察变量a,b在内存中所占字节 Name Size Bytes Class a 1x1 8 double array a_s 1x2 16 double array ans 1x4 8 char array b 1x1 2 char array b_s 1x2 16 double arrayGrand total is 10 elements using 50 bytes 4.1.2 串数组的属性和标识【*例4.1.2-1】本例演示:串的基本属性、标识和简单操作。(1)创建串数组a=This is an example. a =This is an example. (2)串数组a的大小size(a) ans = 1 19 (3)串数组的元素标识a14=a(1:4)%提出一个子字符串 ra=a(end:-1:1)%字符串的倒排 a14 =Thisra =.elpmaxe na si sihT (4)串数组的ASCII码ascii_a=double(a)%产生ASCII码 ascii_a = Columns 1 through 12 84 104 105 115 32 105 115 32 97 110 32 101 Columns 13 through 19 120 97 109 112 108 101 46 char(ascii_a)%把ASCII码变回字符串 ans =This is an example. (5)对字符串ASCII码数组的操作%使字符串中字母全部大写w=find(a=a&a=z);%找出串数组a中,小写字母的元素位置。ascii_a(w)=ascii_a(w)-32;%大小写字母ASCII值差32.用数值加法改变部分码值。char(ascii_a)%把新的ASCII码翻成字符 ans =THIS IS AN EXAMPLE. (6)中文字符串数组A=这是一个算例。;%创建中文字符串 A_s=size(A)%串数组的大小 A56=A(5 6)%取串的子数组 ASCII_A=double(A)%获取ASCII码 A_s = 1 7A56 =算例ASCII_A = Columns 1 through 6 54754 51911 53947 47350 52195 49405 Column 7 41379 char(ASCII_A)%把ASCII码翻译成字符 ans =这是一个算例。 (7)创建带单引号的字符串b=Example 4.1.2-1 b =Example 4.1.2-1 (8)由小串构成长串ab=a(1:7), ,b, .%这里第2个输入为空格串 ab =This is Example 4.1.2-1 . 4.1.3 复杂串数组的创建 多行串数组的直接创建【*例-1】多行串数组的直接输入示例。clearS=This string array has multiple rows. S =This string array has multiple rows. size(S) ans =2 18 利用串操作函数创建多行串数组【*例-1】演示:用专门函数char , str2mat , strvcat创建多行串数组示例。S1=char(This string array,has two rows.) S1 =This string arrayhas two rows. S2=str2mat(这,字符,串数组,由4行组成) S2 =这 字符 串数组 由4行组成 S3=strvcat(这,字符,串数组, ,由4行组成)%“空串”会产生一个空格行 S3 =这 字符 串数组 由4行组成 size(S3) ans = 5 5 转换函数产生数码字符串【*例-1】最常用的数组/字符串转换函数int2str , num2str , mat2str 示例。(1)int2str把整数数组转换成串数组(非整数将被四舍五入园整后再转换)A=eye(2,4);%生成一个数值数组 A_str1=int2str(A)%转换成串数组。请读者自己用size检验。 A_str1 =1 0 0 00 1 0 0 (2)num2str把非整数数组转换为串数组(常用于图形中,数据点的标识)rand(state,0)B=rand(2,4); %生成数值矩阵B3=num2str(B,3)%保持3位有效数字,转换为串 B3 = 0.95 0.607 0.891 0.4560.231 0.486 0.762 0.0185 (3)mat2str把数值数组转换成输入形态的串数组(常与eval指令配用)B_str=mat2str(B,4)%保持4位有效数字,转换为“数组输入形式”串 B_str =0.9501 0.6068 0.8913 0.4565;0.2311 0.486 0.7621 0.0185 Expression=exp(-,B_str,);%相当于指令窗写一个表达式exp(-B_str)eval(Expression)%把exp(-B_str)送去执行 ans = 0.3867 0.5451 0.4101 0.6335 0.7937 0.6151 0.4667 0.9817 【*例-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);%生成最大值点的横坐标字符串y_text=y=,num2str(y_max);%生成最大值点的纵坐标字符串max_text=char(maximum,t_text,y_text);%生成标志最大值点的字符串%生成标志图名用的字符串tit=y=exp(-,num2str(a),t)*sin(,num2str(w),t);%plot(t,zeros(size(t),k)%画纵坐标为0的基准线hold on%保持绘制的线不被清除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)%在图上书写最大值点的数据值title(tit),xlabel(t),ylabel(y),hold off%书写图名、横坐标名、纵坐标名 图 -1 字符串运用示意图 利用元胞数组创建复杂字符串【*例-1】元胞数组在存放和操作字符串上的应用。a=MATLAB 5 ;b=introduces new data types:;%创建单行字符串a,bc1=Multidimensional array;c2=User-definable data structure;c3=Cell arrays;c4=Character array;c=char(c1,c2,c3,c4);%创建多行字符串cC=a;b;c;%利用元胞数组存放长短不同的字符串disp(C1:2)%显示前两个元胞中的字符内容disp( )%显示一行空白disp(C3)%显示第3个元胞中的字符内容 MATLAB 5 introduces new data types: Multidimensional array User-definable data structureCell arrays Character array 4.1.4 串转换函数【*例4.1.4-1】fprintf, sprintf, sscanf的用法示例。rand(state,0);a=rand(2,2);%产生随机阵s1=num2str(a)%把数值数组转换为串数组s_s=sprintf(%.10en,a)%10数位科学记述串,每写一个元素就换行。 s1 =0.95013 0.606840.23114 0.48598s_s =9.5012928515e-0012.3113851357e-0016.0684258354e-0014.8598246871e-001 fprintf(%.5g,a)%以5位数位最短形式显示。不能赋值用 0.950130.231140.606840.48598 s_sscan=sscanf(s_s,%f,3,2)%浮点格式把串转换成成数值数组。 s_sscan = 0.9501 0.4860 0.2311 0 0.6068 0 4.1.5 串操作函数4.2 元胞数组4.2.1 元胞数组的创建和显示 元胞标识寻访和内容编址寻访的不同 元胞数组的创建和显示【*例 -1】本例演示:元胞数组的创建。C_str=char(这是,元胞数组创建算例 1);%产生字符串R=reshape(1:9,3,3);%产生实数阵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 = 2x10 char 3x3 double 1.0000+ 2.0000i 1x1 sym (2)直接创建法之二:“编址元胞元素内涵的直接赋值法”B1,1=C_str;B1,2=R;B2,1=Cn;B2,2=S_sym;celldisp(B)%显示元胞数组内容 B1,1 =这是 元胞数组创建算例 1B2,1 = 1.0000 + 2.0000iB1,2 = 1 4 7 2 5 8 3 6 9B2,2 =-sin(3*t)*exp(-t) 4.2.2 元胞数组的扩充、收缩和重组【*例4.2.2-1】元胞数组的扩充。(1)利用cell指令创建元胞数组C=cell(2);%预设空元胞数组 C(:,1)=char(Another,text string);10:-1:1 %对第一列元胞赋值 C = 2x11 char 1x10 double (2)元胞数组的“列”扩充和“行”扩充AC=A C%空格(或逗号)利用来分隔列 A_C=A;C%分号利用来分隔“行” AC = 2x10 char 3x3 double 2x11 char 1.0000+ 2.0000i 1x1 sym 1x10 double A_C = 2x10 char 3x3 double 1.0000+ 2.0000i 1x1 sym 2x11 char 1x10 double 【*例4.2.2-2】cellplot能用图形形象化地表示元胞数组的内容。(A_C取自上例)cellplot(A_C,legend) 图 4.2.2-1 元胞数组A_C的形象化结构图【*例4.2.2-3】元胞数组的收缩和重组。(1)元胞数组的收缩A_C(3,:)=%删除第3行,使A_C成为的元胞数组 A_C = 2x10 char 3x3 double 1.0000+ 2.0000i 1x1 sym 1x10 double (2)把A_C重组成元胞数组R_A_CR_A_C=reshape(A_C,2,3) R_A_C = 2x10 char 1x10 double 1x1 sym1.0000+ 2.0000i 3x3 double 4.2.3 元胞数组内容的调取【*例4.2.3-1】元胞数组内容的调取示例。(1)取一个元胞f1=R_A_C(1,3)%使用园括号寻访得到的是元胞,而不仅是内容。 class(f1) f1 = 1x1 symans =cell (2)取一个元胞的内容f2=R_A_C1,3%用花括号寻访取得内容 class(f2) f2 =sin(-3*t)*exp(-t)ans =sym (3)取元胞内的子数组f3=R_A_C1,1(:,1 2 5 6)%注意三种括号的不同用途%取第1行第1列元胞内容中的第1、2、5、6列。 f3 =这是 元胞创建 (4)同时调取多个元胞内容f4,f5,f6=deal(R_A_C1,3,4)%取三个元胞内容,赋值给三个变量 f4 =这是 元胞数组创建算例 1f5 = 10 9 8 7 6 5 4 3 2 1f6 = 1 4 7 2 5 8 3 6 9 4.3 构架数组4.3.1 构架数组的创建和显示 直接创建法及显示【*例-1】本例通过温室数据(包括温室名、容积、温度、湿度等)演示:单构架的创建和显示。(1)直接对域赋值法产生“单构架”,即构架数组。green_=一号房;%构架的域由(构架名).(域名)标识。 green_house.volume=2000立方米;%green_house.parameter.temperature=31.2 30.4 31.6 28.729.7 31.1 30.9 29.6;%green_house.parameter.humidity=62.1 59.5 57.7 61.5 62.0 61.9 59.2 57.5;% (2)显示“单构架”结构和内容green_house%显示单构架结构 green_house = name: 一号房 volume: 2000立方米 parameter: 1x1 struct green_house.parameter%显示parameter域中内容 ans = temperature: 2x4 double humidity: 2x4 double green_house.parameter.temperature%显示temperature域中的内容 ans = 31.2000 30.4000 31.6000 28.7000 29.7000 31.1000 30.9000 29.6000 【*例-2】本例演示构架数组的创建和显示,并利用构架数组保存一个温室群的数据。本例的运行以例-1为先导。(1)直接对域赋值法“构架数组”。green_house(2,3).name=六号房;%产生构架数组(2)显示构架数组的结构和构架元素的内容green_house%显示构架数组的结构:构架行列数;构架的域。 green_house = 2x3 struct array with fields: name volume parameter green_house(2,3)%显示元素构架的结构:域;是否有子域 ans = name: 六号房 volume: parameter: 利用构造函数创建构架数组【*例-1】利用构造函数struct,建立温室群的数据库。(1)struct预建空构架数组方法之一a=cell(2,3);%创建空元胞数组green_house_1=struct(name,a,volume,a,parameter,a(1,2)% green_house_1 = 2x3 struct array with fields: name volume parameter (2)struct预建空构架数组方法之二green_house_2=struct(name,a,volume,parameter,)% green_house_2 = 2x3 struct array with fields: name volumeparameter (3)struct预建空构架数组方法之三green_hopuse_3(2,3)=struct(name,volume,parameter,)% green_hopuse_3 = 2x3 struct array with fields: name volume parameter (4)struct创建构架数组方法之四a1=六号房;a2=3200立方米;green_house_4(2,3)=struct(name,a1,volume,a2,parameter,);%T6=31.2,30.4,31.6,28.7;29.7,31.1,30.9,29.6;% green_house_4(2,3).parameter.temperature=T6;% green_house_4 ans = 2x3 struct array with fields: name volume parameter 4.3.2 构架数组域中内容的调取和设置【*例4.3.2-1】本例目的:一,演示函数fieldnames , getfield , setfield的使用方法;二,让读者感受到构架数组对应用工具包的影响;三,演示struct函数把“对象”转换为构架的应用。本例为获得一个演练的构架,借助Toolbox control 工具包中的tf函数,先产生一个用传递函数描写的LTI线性时不变2输入2输出系统。(1)产生2输入2输出系统的传递函数阵“对象”Stf=tf(3,2;4 1,1,1 3 2,1 1 1;1 2 2 1,1 0) Transfer function from input 1 to output. 3 #1: - s2 + 3 s + 2 4 s + 1 #2: - s3 + 2 s2 + 2 s + 1 Transfer function from input 2 to output. 2 #1: - s2 + s + 1 1 #2: - s (2)为本例演示,把上述的LTI对象Stf转换为构架SSTF=struct(Stf)%把对象转换成构架,并显示构架的组成 SSTF = num: 2x2 cell den: 2x2 cell Variable: s lti: 1x1 lti (3)获得构架数组SSTF的域名FN=fieldnames(SSTF)%获得域名元胞数组FNclass(FN)%检查FN的类别 FN = num den Variable ltians =cell (4)获取SSTF.den(2,1)域的内容FC=getfield(SSTF,den,2,1)%相当于FC=SSFT.den(2,1)FC1%与celldisp(FC)的作用大致相当poly2str(FC1,s),%为了把多项式显示成习惯的形式 FC = 1x4 doubleans = 1 2 2 1ans = s3 + 2 s2 + 2 s + 1 (5)重新设置SSTF.num(2,1)域的内容SSTF.num2,1%显示原始情况SSTF=setfield(SSTF,num,2,1,1 3 1);%注意“花括号”的使用SSTF.num2,1%显示被重新设置后的情况 ans = 0 0 4 1ans = 1 3 1 4.3.3 构架数组操作深入 构架数组的扩充和收缩【*例-1】本例演示构架数组SSTF的扩充和收缩。(本例以例4.3.2-1的运行为基础。)(1)原构架是一个“单构架”size(SSTF) ans = 1 1 (2)演示构架的扩充SSTF(2,2)=struct(tf(1,1 1)%把1/(s+1)放在第2行第2列构架中size(SSTF) SSTF = 2x2 struct array with fields: num den Variable ltians = 2 2 (3)演示构架数组的收缩:删除构架数组的第1行SSTF(1,:)=%收缩成为的构架S22n=SSTF(1,2).num,S22d=SSTF(1,2).den%取出第2构架num域和den域的内容printsys(S22n1,S22d1)%显示成习惯的表达形式 SSTF = 1x2 struct array with fields: num den Variable ltiS22n = 1x2 doubleS22d = 1x2 double num/den = 1 - s + 1 增添域和删除域【*例-1】对构架数组进行域的增添和删减操作。(1)创建构架数组clear,for k=1:10;department(k).number=No.,int2str(k);enddepartment department = 1x10 struct array with fields: number (2)增添域:在数组中任何一个构架上进行的域增添操作,其影响遍及整个构架数组。department(1).teacher=40;department(1).student=300;department(1).PC_computer=40;department department = 1x10 struct array with fields: number teacher student PC_computer (3)增添子域的操作只影响被操作的那个具体构架,而不是影响整个构架数组。department(2).teacher.male=35;department(2).teacher.female=13;D2T=department(2).teacher%第2构架teacher域包含两个子域D1T=department(1).teacher%第1构架teacher域仅是一个数 D2T = male: 35 female: 13D1T = 40 (4)删除子域的操作也只影响被操作的那个具体构架。department(2).teacher=rmfield(department(2).teacher,male);department(2).teacher ans = female: 13 (5)删除域的操作是对整个构架数组实施的。department=rmfield(department,student)%删除一个域 department = 1x10 struct array with fields: number teacher PC_computer department=rmfield(department,teacher;PC_computer)%删除2个域 department = 1x10 struct array with fields: number 数值运算操作和函数对构架数组的应用【*例-1】数值运算操作和函数在构架域上的作用。n_ex=5;%构架数组的长度for k=1:n_ex,ex(k).f=(k-1)*n_ex+1:5;end%创建构架数组 ex%显示构架数组的结构 ex = 1x5 struct array with fields: f %显示构架数组的域中内容disp(blanks(10) 构架域中内容)for k=1:n_ex,disp(ex(k).f),end 构架域中内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class(ex(1).f)%检查域中内容的类型 ans =double %对各构架域中数值数组相应位置的数据相加求和sum_f=zeros(1,5)for k=1:n_ex,sum_f=sum_f+ex(k).f;end,sum_f sum_f = 55 60 65 70 75 %对构架数组域中各元素分别求平方根disp(blanks(20) ex.f的平方根值)for k=1:n_ex,disp(sqrt(ex(k).f),end ex.f的平方根值 1.0000 1.4142 1.7321 2.0000 2.2361 2.4495 2.6458 2.8284 3.0000 3.1623 3.3166 3.4641 3.6056 3.7417 3.8730 4.0000 4.1231 4.2426 4.3589 4.47214.5826 4.6904 4.7958 4.8990 5.0000 4.3.4 构架数组和元胞数组之间的转换【*例4.3.4-1】指令struct2cell和cell2struct的使用。(1)创建“带2个域的构架数组”for k=1:5,ex(k).s=No. int2str(k);ex(k).f=(k-1)*5+1:5;end (2)显示构架数组的内容fprintf(%sn,ex.s域的内容 );fprintf(%s,blanks(4)for k=1:5;fprintf(%s,ex(k).s blanks(1);endfprintf(%sn,blanks(1),fprintf(%sn,ex.f域的内容 )for k=1:5;disp(ex(k).f);end%显示ex.f域内容 ex.s域的内容 No.1 No.2 No.3 No.4 No.5 ex.f域的内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 (3)把ex构架数组转换为元胞数组C_ex=struct2cell(ex);%“带2个域的构架数组”转换为元胞数组size(C_ex)fprintf(%s,C_ex1,1,1,blanks(3)%显示C_ex第1页第1行第1列内容fprintf(%5g,C_ex2,1,1)%显示C_ex第2页第1行第1列内容 ans = 2 1 5No.1 1 2 3 4 5 (4)把元胞数组转换为构架数组之一FS=S_cha

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论