结构体在matlab中的应用_第1页
结构体在matlab中的应用_第2页
结构体在matlab中的应用_第3页
结构体在matlab中的应用_第4页
结构体在matlab中的应用_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

结构(struct)数组要在MALTAB中实现比较复杂的编程,就不能不用struct类型。而且在MATLAB中实现struct比C中更为方便。4.3.1结构数组的创建MATLAB提供了两种定义结构的方式:直接应用和使用struct函数。1.使用直接引用方式定义结构与建立数值型数组一样,建立新struct对象不需要事先申明,可以直接引用,而且可以动态扩充。比如建立一个复数变量x:x.real=0;%创建字段名为real,并为该字段赋值为0x.imag=0%为x创建一个新的字段imag,并为该字段赋值为0x=real:0imag:0然后可以将旗动态扩充为数组:x(2).real=0;%将x扩充为1X2的结构数组x(2).imag=0;在任何需要的时候,也可以为数组动态扩充字段,如增加字段scale:x(1).scale=0;这样,所有x都增加了一个scale字段,而x⑴之外的其他变量的scale字段为空:x(1)%查看结构数组的第一个元素的各个字段的内容ans—real:0imag:0scale:0x(2)%查看结构数组的第二个元素的各个字段的内容,注意没有赋值的字段为空ans—real:0imag:0scale:[]应该注意的是,x的real、imag、scale字段不一定是单个数据元素,它们可以是任意数据类型,可以是向量、数组、矩阵甚至是其他结构变量或元胞数组,而且不同字段之间其数据类型不需要相同。例如:clearx;x.real=[12345];x.imag=ones(10,10);数组中不同元素的同一字段的数据类型也不要求一样:x(2).real='123';x(2).imag=rand(5,1);甚至还可以通过引用数组字段来定义结构数据类型的某字段:x(3).real=x(1);x(3).imag=3;x(3)ans—real:[1x1struct]imag:3下面看一个实际的例子来熟悉直接引用方式定义与显示结构。【例4.3.1-1]温室数据(包括温室名、容量、温度、湿度等)的创建与显示。(1)直接对域赋值法产生结构变量green_='一号温室';%创建温室名字段green_house.volume='2000立方米';%创建温室容量字段green_house.parameter.temperature=[31.230.431.628.7%创建温室温度字段29.731.130.929.6];green_house.parameter.humidity=[62.159.557.761.5;%创建温室湿度字段62.061.959.257.5];(2)显示结构变量的内容green_house%显示结构变量结构green_house=name:'一号温室'volume:'2000立方米'parameter:[1x1struct]green_house.parameter%用域作用符号.显示指定域(parameter)中内容ans—temperature:[2x4double]humidity:[2x4double]green_house.parameter.temperature%显示temperature域中的内容ans—31.200030.400031.600028.700029.700031.100030.900029.6000【例4.3.1-2】在上例的基础上,创建结构数组用以保存一个温室群的数据。green_house(2,3).name='六号温室';%产生2X3结构数组green_house%显示结构数组的结构green_house=2x3structarraywithfields:namevolumeparametergreen_house(2,3)%显示结构数组元素的结构ans—name:'六号温室'volume:[]parameter:[]2.使用struct函数创建结构使用struct函数也可以创建结构,该函数产生或把其他形式的数据转换为结构数组。struct的使用格式为:s=sturct('field1',values1,'field2',values2,・••);该函数将生成一个具有指定字段名和相应数据的结构数组,其包含的数据values1、valuese2等必须为具有相同维数的数据,数据的存放位置域其他结构位置一一对应的。对于struct的赋值用到了元胞数组。数组values1、values2等可以是元胞数组、标量元胞单元或者单个数值。每个values的数据被赋值给相应的field字段。当valuesx为元胞数组的时候,生成的结构数组的维数与元胞数组的维数才目同。而在数据中不包含元胞的时候,得到的结构数组的维数是1X1的。例如:s=struct('type',{'big','little'},'color',{'blue','red'},'x',{3,4})s=1x2structarraywithfields:typecolorx得到维数为1X2的结构数组s,包含了type、color和x共3个字段。这是因为在struct函数中{'big','little'}、{'blue','red'}和{3,4}都是1X2的元胞数组,可以看到两个数据成分分别为:s(1,1)ans—type:'big'color:'blue'x:3s(1,2)ans—type:'little'color:'red'x:4才目应的,如果将struct函数写成下面的形式:s=struct('type',{'big';'little'},'color',{'blue';'red'},'x',{3;4})s=2x1structarraywithfields:typecolorx则会得到一个2X1的结构数组。下面给出利用struct构建结构数组的具体实例。【例4.3.1-3】利用函数struct,建立温室群的数据库。struct预建立空结构数组方法之一a=cell(2,3);%创建2X3的元胞数组green_house_1=struct('name',a,'volume',a,'parameter',a(1,2))green_house_1=2x3structarraywithfields:namevolumeparameterstruct预建空结构数组方法之二green_house_2=struct('name',a,'volume',[],'parameter',[])green_house_2=2x3structarraywithfields:namevolumeparameterstruct预建空结构数组方法之三green_hopuse_3(2,3)=struct('name',[],'volume',[],'parameter',[])green_hopuse_3=2x3structarraywithfields:namevolumeparameterstruct创建结构数组方法之四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_4ans—2x3structarraywithfields:namevolumeparameter4.3.2结构数组的操作MATLAB中专门用于对结构数组的操作的函数并不多,通过helpdatatypes获取数据类型列表,可以看到其中的结构数据类型的有关的函数,主要如表4.3.1所示。表4.3.1结构数组的操作函数函数名功能描述函数名功能描述deal把输入处理成输出fieldnames获取结构的字段名getfield获取结构中指定字段的值rmfield删除结构的字段(不是字段内容)setfield设置结构数组中指定的字段的值struct创建结构数组struct2cell结构数组转化成元胞数组isfield判断是否存在该字段isstruct判断某变量是否是结构类型下面举一些具体的例子说明如果对结构数组加以操作。【例4.3.2-1]本例目的:一,演示函数fieldnames,getfield,setfield的使用方法;二,让读者感受到结构数组对应用工具包的影响;三,演示struct函数把“对象”转换为结构的应用。本例为获得一个演练的结构,借助Toolboxcontrol工具包中的tf函数,先产生一个用传递函数描写的LTI线性时不变2输入2输出系统。产生2输入2输出系统的传递函数阵“对象”Stf=tf({3,2;[41],1},{[132],[111];[1221],[10]})Transferfunctionfrominput1tooutput...#1:s八2+3s+24s+1#2:s八3+2s八2+2s+1Transferfunctionfrominput2tooutput...2#1:s八2+s+11#2:-s为本例演示,把上述的LTI对象Stf转换为结构SSTF二struct(Stf)%把对象转换成结构,并显示结构的组成SSTF=num:{2x2cell}den:{2x2cell}Variable:'s'lti:[1x1lti](3)获得结构数组SSTF的域名FN二fieldnames(SSTF)%获得域名元胞数组FNclass(FN)%检查FN的类别FN='num''den''Variable''lti'ans—cell获取SSTF.den(2,1)域的内容FC二getfield(SSTF,'den',{2,1})%才目当于FC=SSFT.den(2,1)FC{1}%与celldisp(FC)的作用大致相当poly2str(FC{1},'s'),%为了把多项式显示成习惯的形式FC=[1x4double]ans—1221ans—s八3+2s八2+2s+1重新设置SSTF.num(2,1)域的内容SSTF.num{2,1}%显示原始情况SSTF二setfield(SSTF,'num',{2,1},{[131]});%注意“花括号”的使用SSTF.num{2,1}%显示被重新设置后的情况ans—0041ans—131【例4.3.2-2】本例演示结构数组SSTF的扩充和收缩。(本例以例4.3.2-1的运行为基础。)原结构是一个“单结构”size(SSTF)ans—11演示结构的扩充SSTF(2,2)=struct(tf(1,[11]))%把1/(s+1)放在第2行第2列结构中size(SSTF)SSTF=2x2structarraywithfields:numdenVariableltians—演示结构数组的收缩:删除结构数组的第1行SSTF(1,=[]%收缩成为的结构S22n=SSTF(1,2).num,S22d=SSTF(1,2).den%取出第2结构num域和den域的内容printsys(S22n{1},S22d{1})%显示成习惯的表达形式SSTF=1x2structarraywithfields:numdenVariableltiS22n=[1x2double]S22d=[1x2double]num/den=1【例4.3.2-3】对结构数组进行域的增添和删减操作。创建结构数组clear,fork=1:10;department(k).number=['No.',int2str(k)];enddepartmentdepartment=1x10structarraywithfields:number增添域:在数组中任何一个结构上进行的域增添操作,其影响遍及整个结构数组department(1).teacher=40;department(1).student=300;department(1).PC_computer=40;departmentdepartment=1x10structarraywithfields:numberteacherstudentPC_computer增添子域的操作只影响被操作的那个具体结构,而不是影响整个结构数组department(2).teacher.male=35;department(2).teacher.female=13;D2T=department(2).teacher%第2结构teacher域包含两个子域D1T=department(1).teacher%第1结构teacher域仅是一个数male:35female:13D1T=40删除子域的操作也只影响被操作的那个具体结构department(2).teacher=rmfield(department(2).teacher,'male');department(2).teacherans—female:13删除域的操作是对整个结构数组实施的department=rmfield(department,'student')%删Q除一个域department=1x10structarraywithfields:numberteacherPC_computerdepartment=rmfield(department,('teacher';'PC_computer'})%删Q除2个域department=1x10structarraywithfields:number【例4.3.2-4】数值运算操作和函数在结构域上的作用。n_ex=5;%结构数组的长度fork=1:n_ex,%创建1X5结构数组ex(k).f=(k-1)*n_ex+[1:5];end;ex%显示结构数组的结构ex=1x5structarraywithfields:f%显示结构数组的域中内容disp([blanks(10)'结构域中内容'])fork=1:n_ex,disp(ex(k).f),end结构域中内容23456789101213141516171819202122232425class(ex⑴.f)%检查域中内容的类型ans—double%对各结构域中数值数组相应位置的数据相加求和sum_f=zeros(1,5)fork=1:n_ex,sum_f=sum_f+ex(k).f;end,sum_fsum_f=5560657075%对结构数组域中各元素分别求平方根disp([blanks(20)'ex.f的平方根值'])fork=1:n_ex,disp(sqrt(ex(k).f)),endex.f的平方根值1.00001.41421.73212.00002.23612.44952.64582.82843.00003.16233.31663.46413.60563.74173.87304.00004.12314.24264.35894.47214.58264.69044.79584.89905.0000【例4.3.2-5】指令struct2cell和cell2struct的使用。(1)创建“带2个域的结构数组”fork=1:5,ex(k).s=['No.'int2str(k)];ex(k).f=(k-1)*5+[1:5];end(2)显示结构数组的内容fprintf('%s\n','ex.s域的内容');fprintf('%s\',blanks(4))fork=1:5;fprintf('%s\\',[ex(k).sblanks(1)]);endfprintf('%s\n',blanks(1)),fprintf('%s\n','ex.f域的内容')fork=1:5;disp(ex(k).f);end%显示ex.f域内容ex.s域的内容No.1\No.2\No.3\No.4\No.5\ex.f域的内容2345678910111213141516171819202122232425把ex结构数组转换为元胞数组C_ex=struct2cell(ex);%带2个域的(1X5)结构数组转换为(2X1X5)元胞数组size(C_ex)fprintf('%s\',[C_ex{1,1,1},blanks(3)])%显示C_ex第1页第1行第1列内容fprintf('%5g\',C_ex{2,1,1})%显示C_ex第2页第1行第1列内容ans—15No.112345(4)把元胞数组转换为结构数组之一FS=('S_char';'F_num');%用元胞数组预建域名字符串EX1二cell2struct(C_ex,FS,1)%元胞数组向结构数组转换EX1=1x5structarraywithfields:S_charF_numricEX1⑴%观察新结构EX1第一结构的情况ans—S_char:'No.1'F_numric:[12345]把元胞数组转换为结构数组之二EX2=cell2struct(C_ex,'xx',2)EX2=2x5structarraywithfields:xx把元胞数组转换为结构数组之三YY=strvcat('y1','y2','y3','y4','y5');EX3=cell2struct(C_ex,YY,3)EX3=2x1structarraywithfields:y1y2y3y4y5EX3⑴%观察第一结构情况ans—y1:'No.1'y2:'No.2'y3:'No.3'y4:'No.4'y5:'No.5'EX3(2)%观察第二结构情况ans—y1:[12345]y2:[678910]y3:[1112131415]y4:[1617181920]y5:[2122232425]【例4.3.2-6】带子域的结构数组转换为元胞数组。本例中的ex结构数组由例4.2.2-5生成,然后再运行以下程序。ex(1,1).s%原结构ex(1,1).s中的内容ans—No.1%增设子域,并把ex结构数组扩充为(3X5)。ex(1,1).s.sub='SUB1';%原ex(1,1).s中的字符串将因本指令而消失ex(3,1).s.sub='SUB3';ex(3,1).s.num=1/3;ex(1,1).s%经新赋值后,ex(1,1).s中的内容ans—sub:'SUB1'ex(3,1).s%经新赋值后,ex(3,1).s中的内容ans—sub:'SUB3'num:0.3333C_ex_sub=struct2cell(ex)%把结构转换为元胞数组C_ex_sub(:,:,1)=[1x1struct][][1x1struct][1x5double][][]C_ex_sub(:,:,2)='No.2'[][][1x5double][][]C_ex_sub(:,:,3)='No.3'[][][1x5double][][]C_ex_sub(:,:,4)='No.4'[][][1x5double][][]C_ex_sub(:,:,5)='No.5'[][][1x5double][][]size(C_ex_sub)%观察新元胞数组的大小ans—235C_ex_sub{1,1,1}%观察第一元胞中的内容ans—sub:'SUB1'C_ex_sub{1,3,1}%观察(1,3,1)元胞中的内容ans—sub:'SUB3'num:0.3333结构(struct)数组要在MALTAB中实现比较复杂的编程,就不能不用struct类型。而且在MATLAB中实现struct比C中更为方便。4.3.1结构数组的创建MATLAB提供了两种定义结构的方式:直接应用和使用struct函数。1.使用直接引用方式定义结构与建立数值型数组一样,建立新struct对象不需要事先申明,可以直接引用,而且可以动态扩充。比如建立一个复数变量x:x.real=0;%创建字段名为real,并为该字段赋值为0x.imag=0%为x创建一个新的字段imag,并为该字段赋值为0x=real:0imag:0然后可以将旗动态扩充为数组:x(2).real=0;%将x扩充为1X2的结构数组x(2).imag=0;在任何需要的时候,也可以为数组动态扩充字段,如增加字段scale:x(1).scale=0;这样,所有x都增加了一个scale字段,而x⑴之外的其他变量的scale字段为空:x(1)%查看结构数组的第一个元素的各个字段的内容ans—real:0imag:0scale:0x(2)%查看结构数组的第二个元素的各个字段的内容,注意没有赋值的字段为空ans—real:0imag:0scale:[]应该注意的是,x的real、imag、scale字段不一定是单个数据元素,它们可以是任意数据类型,可以是向量、数组、矩阵甚至是其他结构变量或元胞数组,而且不同字段之间其数据类型不需要相同。例如:clearx;x.real=[12345];x.imag=ones(10,10);数组中不同元素的同一字段的数据类型也不要求一样:x(2).real='123';x(2).imag=rand(5,1);甚至还可以通过引用数组字段来定义结构数据类型的某字段:x(3).real=x(1);x(3).imag=3;x(3)ans—real:[1x1struct]imag:3下面看一个实际的例子来熟悉直接引用方式定义与显示结构。【例4.3.1-1]温室数据(包括温室名、容量、温度、湿度等)的创建与显示。直接对域赋值法产生结构变量green_='一号温室';%创建温室名字段green_house.volume='2000立方米';%创建温室容量字段green_house.parameter.temperature=[31.230.431.628.7%创建温室温度字段29.731.130.929.6];green_house.parameter.humidity=[62.159.557.761.5;%创建温室湿度字段62.061.959.257.5];显示结构变量的内容green_house%显示结构变量结构green_house=name:'一号温室'volume:'2000立方米'parameter:[1x1struct]green_house.parameter%用域作用符号.显示指定域(parameter)中内容ans—temperature:[2x4double]humidity:[2x4double]green_house.parameter.temperature%显示temperature域中的内容ans—31.200030.400031.600028.700029.700031.100030.900029.6000【例4.3.1-2】在上例的基础上,创建结构数组用以保存一个温室群的数据。green_house(2,3).name='六号温室';%产生2X3结构数组green_house%显示结构数组的结构green_house=2x3structarraywithfields:namevolumeparametergreen_house(2,3)%显示结构数组元素的结构ans—name:'六号温室'volume:[]parameter:[]2.使用struct函数创建结构使用struct函数也可以创建结构,该函数产生或吧其他形式的数据转换为结构数组。struct的使用格式为:s=sturct(*field1,,values1;field2',values2,…);//注意引号该函数将生成一个具有指定字段名和相应数据的结构数组,其包含的数据values1、valuese2等必须为具有相同维数的数据,数据的存放位置域其他结构位置一一对应的。对于struct的赋值用到了元胞数组。数组values1、values2等可以是元胞数组、标量元胞单元或者单个数值。每个values的数据被赋值给相应的field字段。当valuesx为元胞数组的时候,生成的结构数组的维数与元胞数组的维数相同。而在数据中不包含元胞的时候,得到的结构数组的维数是1X1的。例如:s=struct(,type,,{,big,,,little,},,color,,{,blue,,'red,},,x,,{3,4})s=1x2structarraywithfields:typecolorx得到维数为1X2的结构数组s,包含了type、color和x共3个字段。这是因为在struct函数中{'big','little'}、('blue','red'}和(3,4}都是1X2的元胞数组,可以看到两个数据成分分别为:s(1,1)ans—type:'big'color:'blue'x:3s(1,2)ans—type:'little'color:'red'x:4相应的,如果将struct函数写成下面的形式:

温馨提示

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

评论

0/150

提交评论