MATLAB2009从入门到精通课程主要内容第1章MATLAB简介第2章数值运算第3章单元数组和结构第4章字符串第5章 符号运算第6章MATLAB绘图基础第7章程序设计第8章计算方法的MATLAB实现第9章优化设计第10章SIMU LINK仿真初探第3章单元数组和结构在前面章节已经介绍了几种MATLAB2009常用的数据类型。本章将介绍两种特殊的数据类型 ,即单元数组和结构体数组,这两种数据类型的特点是允许用户将不同但是相关的数据类型集成到一个单一的变量。这样,因为相关的数据可以通过 一个单元数组或是结构体的数组进行组织和访问,数据的管理就变得相对要容易一些。3.1单元数组单元数组就是每一个元素为一个单元的 数组。每个单元可以包含任意数据类型的MATLAB2009数组。例如,单元数组的一个单元可以是一个实数矩阵,或是一个字符串数组,也可 以是一个复向量数组。3.1.1单元数组的生成直接生成单元数组:用类似矩阵的记号将给复杂的数据结构纳入一个变量之下。和矩阵中 的圆括号表示下标类似,单元数组由大括号表示下标。包括左标志法和右标志法。左标志法:左标志法就是把单元标志{}放在左边。右标志法 :右标志法就是把单元标志{}放在右边。左标志法>>c{1,1}=''abc'';>>c{1,2}=eye(2);>>c{ 2,1}=[12;34];>>c{2,2}=[12];>>cc=''abc'' [2x2double][2x2double][1x2double]右标志法>>c(1,1)={''ab c''};>>c(1,2)={eye(2)};>>c(2,1)={[12;34]};>>c(2,2)={[12]} ;>>cc=''abc''[2x2double][2x2double] [1x2double]上面的单元数组也可由下面的方法直接得到:>>c={''abc'',eye(2);[12;34], [12]}c=''abc''[2x2double][2x2double] [1x2double]使用cell函数生成单元数组:cell(n)生成一个nn阶的置空单元数组;cell(m,n) 或cell([m,n])生成一个mn阶的置空单元数组;cell(m,n,p,…)或cell([m,n,p,…])生成一个mn p…阶的置空单元数组;cell(size(a))生成与a同形式的单元型置空矩阵。cell函数生成单元数组>>a=cell (2)a=[][][][]>>a{1,1}=[12;22]a= [2x2double][][][]>>a{1 ,2}=[''MATLAB2009'']a=[2x2double]''MATLAB2009'' [][]>>a{2,1}=[''peking''] a=[2x2double]''MATLAB2009''''peking'' []>>a{2,2}=[12]a=[2x2double]''MATLAB2009'' ''peking''[1x2double]3.1.2单元数组显示单元数组的显示有以下几种方式 一是直 接在命令窗口中输入单元数组的名字;二是使用函数celldisp(c)来输出。想得到单元数组中某一个单元的值时,可以采用c(m, n)或c{m,n}的格式输出。但是它们得到的结果表示形式是不同的。函数celldisp(c)更适用于具有大量数据的单元数组的显示 。c{m,n}和celldisp(c)显示的结果形式相同。celldisp(a,’name’)在窗口中显示的单元型变量的内容 的名称为name。程序实例>>c={''abc'',eye(2);[12;34],[12]};>>cc= ''abc''[2x2double][2x2double][1x2double] >>celldisp(c)c{1,1}=abcc{2,1}=123 4c{1,2}=1001c{2,2}=12>> c={''abc'',eye(2);[12;34],[12]};>>c(1,2)ans=[2x2dou ble]>>c{1,2}ans=1001>>a={[12],[1 23];[23],[234]};>>celldisp(a,''hh'')hh{1,1}=1 2hh{2,1}=23hh{1,2}=123hh{2,2 }=2343.1.3单元数组绘图h=cellplot(c)返回一个向量,这个向量综合体现了 表面、线和句柄。h=cellplot(c,’legend’)返回一个向量,这个向量综合体现了表面、线和句柄,并有图形注释。程序 实例>>a={[12;22],''MATLAB2009'';''peking'',[12]};>>h=cellplot(a) h=152.0029153.0024154.0024155.0024156.00241 57.0024158.0024程序实例>>a={[12;22],''MATLAB2009'';''peking'',[1 2]};>>h=cellplot(a,''legend'')h=152.0035153.0026154. 0026155.0026156.0026157.0026158.00263.1.4单元数组合并与变形 使用c=[a,b]或c=[a;b]将两个单元数组集成一个更大的数组。使用c(n,:)=[]删除单元数组的第n行。reshape (x,m,n)和reshape(x,[m,n])将单元数组x的所有元素分配到一个mn的单元数组,但单元数组元素不是mn时,返回 错误信息。行列数不相等的话,仍是按列优先的原则。单元数组合并实例>>a={[12],''as''};>>b={[25], ''AD''};>>c=[a,b]c=[1x2double]''as''[1x2double] ''AD''>>d=[a;b]d=[1x2double]''as''[1x2doubl e]''AD''单元数组删除实例>>d={[12],''as'';[25],''AD''};>>d(1,:)=[]d =[1x2double]''AD''单元数组变形实例>>d={[12],''as'';[25],''AD ''};>>c=reshape(d,1,4)c=[1x2double][1x2double] ''as''''AD''3.2结构型变量结构体是根据属性名组织起来的不同类型数据的集合。结构体和单元数组的共同之处在于它 们都提供了一种分级存储机制来存储不同类型的数据,不同之处是组织数据的方式不一样。结构体数组里的数据是通过属性名来引用的,而在单元数 组里,数据是通过单元数组下标引用来操作的。3.2.1结构型变量的生成直接输入法:采用直接输入法时,在给结构体成员元素直接赋 值的同时定义该元素的名称,并使用点儿将结构型变量和成员元素名连接。程序实例>>student.test=[995696 876769877692];>>student.name=''HuangLiang'';>>student.we ight=67;>>student.height=1.68;>>student.num=034093;>>studen t.add=''Schoolofcivilengneering.Tsinghuauniversity'';>>studen t.tel=''13810498313'';结构体显示输入结构体名称student实现结构体显示:>>studentstu dent=test:[995696876769877692]name:''Hua ngLiang''weight:67height:1.6800num:34093 add:''Schoolofcivilengneering.Tsinghuauniversity'' tel:''13810498313''增加结构体变量可以通过以下形式语句添加新的结构变量(另外的学生数据)。>>studen t(2).test=[996588787698759659];>>%系统将默认之前的student为stude nt(1)>>student(2).name=''WeiHuan'';>>student(2).weight=50;>> student(2).height=1.58;>>student(2).num=034999;>>student(2).n um=034999;>>student(2).add=''SchoolofPsychology.Chongqinguniv ersity'';>>student(2).tel=''02361701456'';此时,输入student将只得到该结构的成员变 量名而不显示内容>>studentstudent=1x2structarraywithfields: testnameweightheightnumaddtel可以继续 在窗口中输入student(1)或student(2)来查询其具体内容。>>student(2)ans= test:[996588787698759659]name:''WeiHuan''wei ght:50height:1.5800num:34999add:''School ofPsychology.Chongqinguniversity''tel:''02361701456''使用s truct函数生成结构变量Struct_array=struct(‘field’,v1,’field2’,v2,…),其中,f ield为各成员变量名,v1等为对应的各成员变量的内容,但是必须配对出现。程序实例>>student=struct(''tes t'',[996588787698759659],''name'',''WeiHuan'',''weight'',50,''he ight'',1.5800)student=test:[996588787698759659]nam e:''WeiHuan''weight:50height:1.5800失败的生成实例student=struct(''tes t'',[996588787698759659],''name'',''WeiHuan'',''weight'',50,''he ight'')???Errorusing==>structFieldandvalueinputargument smustcomeinpairs.添加结构体变量>>student=struct(''fen'',86,''gao'',1 76)student=fen:86gao:176>>student(2)=struct(''fe n'',90,''gao'',170)student=1x2structarraywithfields:fe ngao3.2.2结构体变量的操作在结构体变量中添加成员变量>>student(1).gender=''Mal e'';>>student(1).age=25;>>student(2).gender=''Female'';>>stud ent(2).age=21;在结构体变量中删除成员变量s=rmfield(s,’field’)从mn阶的结构体变量s中删除 指定的成员变量field。但该函数仍保留原有结构形式。s=rmfield(s,fields)当fields是单元型变量时,将一次 性删除多个成员变量。程序实例>>s=rmfield(student,''name'')s=test:[9 95696876769877692]weight:67height:1.6800 num:34093add:''Schoolofcivilengneering.Tsinghuaun iversity''tel:''13810498313''>>s=rmfield(student,{''weight '',''test''})s=name:''HuangLiang''height:1.6800 num:34093add:''Schoolofcivilengneering.Tsinghua university''tel:''13810498313''在结构体变量中调用成员变量结构变量中的任何信息,可 以通过“结构体名称+成员变量名”的格式进行取出。例如:student(1).test从结构体变量中获取某个成员变量时,可以直接 输入变量名+成员名称,也可以采用循环语句的方式。例如:student.test程序实例>>student.nameans =HuangLiangans=WeiHuan>>fori=1:length(student)d isp(student(i).name);endHuangLiangWeiHuan函数法取值和赋值g etfield函数取得当前存储在某个成员变量中的值。表达式f=getfield(s,’field’)返回指定成员变量的内容,与表达 式f=s.field等价。setfield函数给某个成员变量插入新的值。表达式s=setfield(s,‘field’,v)将成 员变量field的值设置为v与表达式s.field=v等价。程序实例>>c=getfield(student,''name'') c=WeiHuan>>c=setfield(student,''name'',''Tom'')c=te st:[996588787698759659]name:''Tom''weight:50 height:1.5800结构体名称返回与判断names=fieldnames(s)返回结构体s中的成员变量名称 。isfield(s,’field’)判断field是否是结构体s中的成员变量名称,是输出1,不是输出0。isstruct( s)判断s是否是结构体数组,是输出1,不是输出0。成员名称返回实例>>student=struct(''test'',[99 6588787698759659],''name'',''WeiHuan'',''weight'',50,''height'',1 .5800);>>names=fieldnames(student)names=''test''''name''''weight''''height''结构体成员判断实例>>student=struct(''test'',[996588787698759659],''name'',''WeiHuan'',''weight'',50,''height'',1.5800);>>r=isfield(student,''test'')r=1>>r=isfield(student,''num'')r=0结构体判断实例>>student=struct(''test'',[996588787698759659],''name'',''WeiHuan'',''weight'',50,''height'',1.5800);>>a=10;>>isstruct(student)ans=1>>isstruct(a)ans=0谢谢! |
|