matlab教学课件:第六章 数据阵列类型与结构

上传人:ni****g 文档编号:569970552 上传时间:2024-08-01 格式:PPT 页数:200 大小:946KB
返回 下载 相关 举报
matlab教学课件:第六章 数据阵列类型与结构_第1页
第1页 / 共200页
matlab教学课件:第六章 数据阵列类型与结构_第2页
第2页 / 共200页
matlab教学课件:第六章 数据阵列类型与结构_第3页
第3页 / 共200页
matlab教学课件:第六章 数据阵列类型与结构_第4页
第4页 / 共200页
matlab教学课件:第六章 数据阵列类型与结构_第5页
第5页 / 共200页
点击查看更多>>
资源描述

《matlab教学课件:第六章 数据阵列类型与结构》由会员分享,可在线阅读,更多相关《matlab教学课件:第六章 数据阵列类型与结构(200页珍藏版)》请在金锄头文库上搜索。

1、第六章 数据阵列类型与结构 第六章 数据阵列类型与结构6.1 多维阵列多维阵列 6.2 结构阵列结构阵列 6.3 单元阵列单元阵列 6.4 复杂矩阵结构复杂矩阵结构 6.5 多维阵列、结构阵列和单元阵列函数多维阵列、结构阵列和单元阵列函数 习题习题 第六章 数据阵列类型与结构 6.1 多多 维维 阵阵 列列 6.1.1 多维阵列多维阵列多维阵列是二维矩阵的推广。矩阵有二维:行和列,利用两个下标可访问矩阵元素,第一个下标表示行号,第二个下标表示列号。多维阵列应使用三个以上的下标来访问,以三维阵列为例,它有三个下标,第一个表示行号,第二个表示列号,第三个表示页号。图6.1表示一个443的多维阵列结

2、构。例如,访问阵列A的第二页第三行第四列的元素,则可以采用A(3,4,2)。第六章 数据阵列类型与结构 图6.1443的多维阵列结构第六章 数据阵列类型与结构 6.1.2 建立多维阵列建立多维阵列建立多维阵列与建立矩阵的方法类似。但MATLAB还为建立多维阵列提供了专门的函数。建立多维阵列可采用四种方法:利用下标建立多维阵列。利用MATLAB函数产生多维阵列。利用cat函数建立多维阵列。用户自己编写M文件产生多维阵列。第六章 数据阵列类型与结构 1利用下标建立多维阵列利用下标建立多维阵列建立多维阵列可从产生二维矩阵出发,扩展其维数,从而得到多维阵列。例如,先产生一个矩阵A=572;012;34

3、2;这时A只是一个33的矩阵,实际上也可看作是331的阵列,因此再输入第六章 数据阵列类型与结构 A(:,:,2)=273;428;203A(:,:,1)=572012342A(:,:,2)=273428203这说明我们已经产生了一个332的多维矩阵A。第六章 数据阵列类型与结构 如果要扩展维的所有元素均相同,则可用标量来输入。例如:A(:,:,3)=6;A(:,:,3)ans=666666666第六章 数据阵列类型与结构 进一步扩展维数可得到4维阵列:A(:,:,1,2)=eye(3);A(:,:,2,2)=5*eye(3);A(:,:,3,2)=10*eye(3);size(A)ans=3

4、332这说明得到的矩阵A为3332维。第六章 数据阵列类型与结构 2利用利用MATLAB函数产生多维阵列函数产生多维阵列利用MATLAB的函数(如rand、randn、ones、zeros等)都可直接产生多维阵列,在函数调用时可指定每一维的尺寸。例如,为产生10032维的正态分布随机数R,可输入R=randn(100,3,2);为产生各元素相同的多维阵列,可采用ones函数,也可采用repmat函数,如输入A=5*ones(3,4,2);B=repmat(5,342);这两个多维阵列是相同的,即A=B。第六章 数据阵列类型与结构 3利用利用cat函数建立多维阵列函数建立多维阵列利用cat函数建

5、立多维阵列是方便的,任何两个维数适当的阵列可按指定维进行连接,从而可以产生更高维阵列。例如输入A=28;05;B=18;24;当它们沿着第三维以上的维进行连接时,可得到多维阵列,如输入:第六章 数据阵列类型与结构 C=cat(3,A,B);D=cat(4,A,B);size(C)ans=222size(D)ans=2212这说明得到的C为222维,而D为2212维。第六章 数据阵列类型与结构 当某一维的尺寸为1时,则称这一维为单点维,比如D中第三维为单点维。cat函数还可以嵌套调用。例如继续输入:E=cat(3,C,cat(3,1112;1314,56;78);这时产生的E为224维。第六章

6、数据阵列类型与结构 4用户自定义用户自定义M文件产生多维阵列文件产生多维阵列对于任意指定的多维阵列,用户都可以编写专门的M文件来产生,这样可避免在设计中过多地在程序中输入数据。在实际记录每天、每月、每年测量的有关数据时,也可以编写M文件将它们组合成多维阵列,从而提供给设计者使用。第六章 数据阵列类型与结构 6.1.3 多维阵列信息多维阵列信息利用MATLAB函数和命令可以获得多维阵列的信息,ndims函数可获得多维阵列的维数,size函数可得到阵列各维的尺寸,whos命令可得到阵列的存储和格式。例如,继续上面产生的阵列,输入:第六章 数据阵列类型与结构 whosNameSizeBytesCla

7、ssA2232doublearrayB2232doublearrayC22264doublearrayD4-D64doublearrayE224128doublearrayans1432doublearrayGrandtotalis44elementsusing352bytessize(E)ans=224ndims(E)ans=3第六章 数据阵列类型与结构 6.1.4 多维阵列的使用多维阵列的使用许多应用于二维矩阵的概念和技术也可以应用于多维阵列,主要有下标访问技术。阵列重新排列。阵列的序列变换。为说明这几种技术,先产生一多维随机整数阵列:d=fix(20*randn(10,5,3);这一阵列

8、为1053维,而且其元素取值为整数。第六章 数据阵列类型与结构 1下标访问技术下标访问技术访问多维阵列中的元素应采用各维的下标,例如,访问第2页(3,2)位置上的元素可采用d(3,2,2)。而且在下标中可以采用向量,表示多个元素,例如,取第3页(2,1)、(2,3)和(2,4)上的元素时,可输入d(2,134,3)ans=132417第六章 数据阵列类型与结构 冒号(:)操作符在向量和矩阵操作中起着重要作用,同样在多维阵列中,也可以利用冒号来使用多维阵列。例如:x1=d(:,3,2)x1=31-102431-41第六章 数据阵列类型与结构 582721-15-5说明取出d中第2页第3列的所有元

9、素。同样x2=d(2:3,1:2,1)x2=-41-10-14-18说明取出d中第1页由2、3行,1、2列构成的22矩阵。第六章 数据阵列类型与结构 同样在赋值号左边也可以使用冒号,如d(1,:,2)=1:5表示用1、2、5取代第2页第1行上的5个元素。第六章 数据阵列类型与结构 2阵列重新排列阵列重新排列我们还可以在建立多维阵列之后改变其尺寸和维数。其方法是直接在多维阵列中添加或删除元素有可能改变阵列的尺寸和维数,也可以利用reshape函数,在保持所有元素个数和内容的前提下,改变其尺寸和维数。例如:第六章 数据阵列类型与结构 M=cat(3,fix(15*rand(3,4),fix(10*

10、rand(3,4)M(:,:,1)=29013341162266M(:,:,2)=866558372084第六章 数据阵列类型与结构 则输入:N=reshape(M,4,6)N=24688832135052062679116634可以看出,reshape函数是按列方式操作的。又如对上面产生d,有下列合法指令:y1=reshape(d,625)y2=reshape(d,5310)y3=reshape(d,2535)第六章 数据阵列类型与结构 应注意,prod(size(d)=prod(size(y1)=prod(size(y2)=prod(size(y3),这一点也是采用reshape函数的基本

11、要求。利用squeeze函数可以删除多维阵列中的单点维,例如:b=repmat(6,4313);c=squeeze(b);size(b)ans=4313size(c)ans=433但应注意,squeeze对二维阵列(即矩阵)不起作用。第六章 数据阵列类型与结构 3阵列的序列变换阵列的序列变换permute函数可改变多维阵列中指定维的次序,例如,对于前面产生的M阵列,有M1=permute(M,213)M1(:,:,1)=23294201161366M1(:,:,2)=852680638574第六章 数据阵列类型与结构 在命令中,2表示原M阵列的第二维,l、3分别表示M阵列的第一、三维,这一命令

12、说明将M阵列的第一维与第二维交换,也就完成了每页上二维阵列的转置,又如:A=randn(5,4,3,2);B=permute(A,2431);size(B)ans= 4235实际上,可以将多维阵列的序列变换看作是二维阵列(矩阵)转置的扩展。在序列变换中也可直接确定出元素之间的位置关系,在上例中A(4,2,1,2)=B(2,2,1,4)。第六章 数据阵列类型与结构 6.1.5 多维阵列计算多维阵列计算1面向向量的函数面向向量的函数对这一类函数(如sum,mean等)通常总是在第一个非单点维上操作,而且大多数函数允许指定操作的维。但是也有例外,比如cross函数(求两个向量的外积)缺省时在第一个长

13、度为3的维上进行操作。第六章 数据阵列类型与结构 2面向元素的函数面向元素的函数按元素对元素的操作函数,如三角函数、指数函数等,可按对二维阵列的操作方式对多维阵列进行处理。例如,设x为mnp维阵列,则y=sin(x)也为mnp维阵列,而且其每个元素分别是x中相应元素的正弦值,即y(i,j,k)=sin(x(i,j,k)。同样,算术、逻辑和关系操作符也可按元素对元素的方式对多维阵列进行处理,其结果阵列的维数和尺寸与输入相同。但如果操作数中有一个为标量,另一个为阵列,则在标量与阵列的所有元素之间应用指定的操作符。第六章 数据阵列类型与结构 3面向矩阵的函数面向矩阵的函数面向矩阵的函数(如线性代数函

14、数和矩阵函数),不能应用于多维阵列,给这些函数提供多维阵列会导致一个错误。例如:A=randn(4,4,5);eig(A)?Errorusing=eigInputargumentsmustbe2-D.第六章 数据阵列类型与结构 这说明eig函数不能应用于多维阵列。但我们可从多维阵列中取出一部分,以作为这类函数的输入,只要维数、尺寸适当,也是完全可以的。例如:eig(A(:,:,3)ans=-0.24390.7981+2.0230i0.7981-2.0230i2.7431第六章 数据阵列类型与结构 6.1.6 多维阵列的数据组织多维阵列的数据组织多维阵列可表示两类数据:表示成二维数据的平面或页,

15、这样可将这些页当作矩阵处理。表示成多变量或多维数据,例如要表示一个房间中栅格点上的温度或气压,则应用四维阵列表示。现在考虑RGB图像数据,它是一个三维阵列,其组织结构如图6.2所示。这样要访问RGB的整个平面时,可输入red_plane=RGB(:,:,1);第六章 数据阵列类型与结构 访问三个平面上的一块子区域,可输入subimage=RGB(15:25,50:85,:);相应某一点(如(4,3)的红、绿、蓝三色强度分别为RGB(4,3,1),RGB(4,3,2),RGB(4,3,3)。每一点上的颜色可根据三色原理进行计算:Color=0.30*RGB(:,:,1)+0.59*RGB(:,:

16、,2)+0.11*RGB(:,:,3)第六章 数据阵列类型与结构 图6.2RGB图像数据阵列的组织第六章 数据阵列类型与结构 6.2 结结 构构 阵阵 列列 6.2.1 建立结构阵列建立结构阵列建立结构阵列有两种方式:使用赋值语句。使用struct函数。第六章 数据阵列类型与结构 1利用赋值语句建立结构阵列利用赋值语句建立结构阵列利用赋值语句可对结构阵列的各个域进行赋值,注意结构名与域名之间用句点分隔,例如,为建立表示患者病情的结构,可输入patient.name=JohnDoe;patient.billing=127.00;patient.test=797573;180178177.5;22

17、0210205;第六章 数据阵列类型与结构 这时就建立起了一个具有三个域的结构patient,当输入patientpatient=name:JohnDoebilling:127test:3x3doublesize(patient)ans=11第六章 数据阵列类型与结构 这表明patient中包含有一个结构元素。我们很容易在已有结构中添加新的结构元素:patient(2).name=AnnLane;patient(2).billing=28.50;patient(2).test=687068;118118119;172170169;这时再输入patientpatient=1x2structarr

18、aywithfields:namebillingtest第六章 数据阵列类型与结构 MATLAB约定,当结构中包含两个以上的结构元素时,输入阵列名时不再显示出各个元素的值,而是显示阵列的结构信息。当结构中仅包含一个结构元素时,则输入阵列名时可显示出各个元素的值。利用fieldnames函数可直接得到结构的域名,如可输入n=fieldnames(patient)n=namebillingtest第六章 数据阵列类型与结构 在扩展结构时,MATLAB会对未指定值的域填入空阵列,以确保结构阵列中的所有元素具有相同数量的域。所有的域具有相同的域名。例如再输入patient(3).name=AlanJo

19、hnson;第六章 数据阵列类型与结构 这时虽然尚未输入第三个结构元素的billing和test域,但它们已经存在,其内容为空阵列,可输入:patient(3)ans=name:AlanJohnsonbilling:test:第六章 数据阵列类型与结构 假设我们在输入patient(3).billing时写错了域名:patient(3).biling=95.8;patient(3).test=373836;119121120;165166159;这时patientpatient=1x3structarraywithfields:namebillingtestbiling第六章 数据阵列类型与结

20、构 说明,这时patient中有三个结构元素,每个元素有四个域,实际上,前两个元素的biling域为空,第三个元素的billing域也为空。为解决这种错误,可用rmfield函数删除错误的域名:patient=rmfield(patient,biling);patient(3).billing=95.8第六章 数据阵列类型与结构 2利用利用struct函数建立结构阵列函数建立结构阵列利用struct函数可方便地建立结构阵列,例如,将前面产生的patient结构改成patient1=struct(name,JohnDoe,billing,127,.test,797573;180178177.5;

21、220210205);这时可产生一个结构元素的结构阵列patient1。利用单元阵列还可以一次输入多个结构元素,例如输入第六章 数据阵列类型与结构 n=JohnDoeAnnLaneAlanJohnson这是一个单元阵列n=JohnDoeAnnLaneAlanJohnsonb=12728.595.8;t1=797573;180178177.5;220210205;t2=687068;118118119;172170169;t3=373836;119121120;165166159;patient2=struct(name,n,billing,b,test,t1t2t3);patient2pati

22、ent2=13structarraywithfields:namebillingtest第六章 数据阵列类型与结构 6.2.2 结构阵列数据的使用结构阵列数据的使用在结构阵列中,利用结构名后的括号指示第n个结构元素,利用句点引出的域名指示相应的域,因此有str=patmnt(2).namestr=AnnLanen1=patient(1).test(3,2)n1=210第六章 数据阵列类型与结构 这样每次只能得到结构中一个域的赋值,如果要得到多个域的赋值,则可采用循环,例如:fori=1:length(patient)disp(patient(i).name);end则执行后可得JohnDoeA

23、nnLaneAlanJohnson第六章 数据阵列类型与结构 访问结构阵列中的元素可采用下标,例如:second=patient(2)second=name:AnnLanebilling:28.5000test:3x3double利用getfield函数可方便地得到域值,如输入str=getfield(patient,2,name)str=AnnLaneV=getfield(patient,1,test,2:3,1:2)V=180178220210第六章 数据阵列类型与结构 另外,利用setfield可改变结构的域值,例如:patient=setfield(patient,1,test,2,1

24、,185);V1=getfield(patient,1,test,2:3,1:2)V1=185178220210注意V与V1的区别,这说明了setfield函数所起的作用。第六章 数据阵列类型与结构 6.2.3 结构阵列应用于函数和操作符结构阵列应用于函数和操作符与普通阵列一样,MATLAB的函数和操作符可以应用于结构阵列中的域和域元素,例如,为求出patient(2)中test阵列的列均值,可输入mean(patient(2).test)ans=119.3333119.3333118.6667第六章 数据阵列类型与结构 有时可采用多种方法来完成指定的功能,例如,要计算patient中各病人的

25、费用之和,这时可利用循环来计算:total=0;fori=1:length(patient)total=total+patient(i).billingenddisp(total)251.3000第六章 数据阵列类型与结构 为简化操作,MATLAB可对结构阵列中同名域的数据进行直接处理,例如,上述操作可简化为total=sum(patient.billing)total=251.3000第六章 数据阵列类型与结构 6.2.4 结构阵列的数据组织结构阵列的数据组织结构阵列数据的组织方式,应该以方便使用、意义直观为基本出发点。例如,对一个独立存储的三个128128的RGB阵列,RED、GREEN和

26、BLUE如图6.3所示,要用它们构成结构阵列至少有两种方法:平面组织和元素对元素组织,如图6.4所示。第六章 数据阵列类型与结构 图6.3独立存储的RGB数据第六章 数据阵列类型与结构 图6.4两种结构阵列的组织方法第六章 数据阵列类型与结构 1平面组织平面组织在平面组织方式下,结构的每个域是整个图像平面,因此这种结构的建立可通过下列命令完成:A.r=RED;A.g=GREEN;A.b=BLUE;这样定义的结构可容易提取红、绿、蓝这三个平面的数据,以供滤波、变换及显示之用。例如,获得红色全平面数据可输入red_plane=A.r;第六章 数据阵列类型与结构 平面组织方式还有一个优点,它很容易扩

27、展到更多的平面或者多个图像,比如在本例中,如果存在多个图像,则可将它们组织到A(2)、A(3)等结构中。平面组织的缺点是,在访问平面的子集时比较麻烦。例如,要访问图像的子集,应分别输入red_sub=A.r(2:12;13:30);grn_sub=A.g(2:12;13:30);blue_sub=A.b(2:12;13:30);第六章 数据阵列类型与结构 2元素对元素组织元素对元素组织元素对元素组织可方便地访问数据的子集,但为建立这种结构,应采用循环程序:fori=1:size(RED,1)forj=1:size(RED,2)B(i,j).r=RED(i,j);B(i,j).g=GREEN(i

28、,j);B(i,j).b=BLUE(i,j);endend第六章 数据阵列类型与结构 这时访问子集比较容易:B_sub=B(2:12,13:30);但访问整个平面的数据又显得麻烦:red_plane=zeros(128,128);fori=1:(128*128)red_plane(i)=B(i).r;end第六章 数据阵列类型与结构 6.2.5 结构嵌套结构嵌套在结构阵列中,其域值可以是另一个已定义过的结构,这称之为结构嵌套。这种结构嵌套给我们提供了灵活的思维空间,可以设计出复杂的结构,甚至可用来设计简单的数据库。这里以一个示例来说明嵌套结构阵列的建立与使用。先利用struct建立嵌套结构阵列

29、的一个元素,然后利用赋值语句进行扩展,如输入第六章 数据阵列类型与结构 A=struct(data,347;801,nest,struct(testnum,Test1,xdata,428,ydata,716);A(2).data=932;765;A(2).nest.testnum=Test2;A(2).nest.xdata=342;A(2).nest.ydata=509第六章 数据阵列类型与结构 图6.5嵌套结构阵列第六章 数据阵列类型与结构 A(1).dataans=347801A(2).nestans=testnum:Test2xdata:342ydata:509A(2).nest.tes

30、tnumans=Test2A(2).nest.ydata(1,3)ans=9第六章 数据阵列类型与结构 6.2.6 设计举例设计举例 利用结构阵列可方便地构造简单的数据库。现根据某校某教研室三位教师的教学情况构成结构阵列,其教学情况如表6.1所示。第六章 数据阵列类型与结构 表表6.1 教师教学情况教师教学情况 第六章 数据阵列类型与结构 从图中可以看出,结构阵列中除了应给出教师的基本信息(姓名、出生日期、职称和学位)外,还应给出每位教师承担教学的情况,并且约定每位教师一年的课程至多为三门,每门课程又给出课程名称、学时、学分和学生人数等信息。根据这种结构上的要求,可选用嵌套结构来实现教学情况的

31、记录。MATLAB程序为第六章 数据阵列类型与结构 第六章 数据阵列类型与结构 Teacher(3)=struct(name,张智胜,bdate,571219,profp,教授,degree,博士,CourA,A,CourB,B,CourC,C);这时得到了教师情况的结构阵列Teacher。为计算各位教师的工作量可输入fori=1:length(Teacher)w=Teacher(i).CourA.time+Teacher(i).CourB.time+Teacher(i).CourC.time;disp(strcat(Teacher(i).name,全年工作量为)num2str(w)end第六

32、章 数据阵列类型与结构 执行后可以统计出每位教师的年工作量如下:王国庆全年工作量为196陈立新全年工作量为186张智胜全年工作量为82为查询陈立新教师的上课情况,可输入disp(Teacher(2)disp(Teacher(2).CourA)disp(Teacher(2).CourB)disp(Teacher(2).CourC)第六章 数据阵列类型与结构 执行后得到name:陈立新bdate:620317profp:副教授degree:硕士CourA:1x1structCourB:1x1structCourC:1x1struct第六章 数据阵列类型与结构 Cname:微机原理time:90co

33、re:6stu:51Cname:计算机通信time:36core:2stu:45Cname:线性代数time:60core:4stu:86第六章 数据阵列类型与结构 6.3 单单 元元 阵阵 列列 MATLAB允许将不同类型的阵列组合成一种新的阵列,这一阵列称之为单元阵列。单元阵列中的每个单元可以是标量、向量、矩阵、多维阵列、字符阵列、结构阵列等,从而构成一个复杂的存储结构。图6.6是单元阵列的一个示例。第六章 数据阵列类型与结构 图6.6单元阵列示例第六章 数据阵列类型与结构 示例中的单元阵列的尺寸为23,但每个单元的类型不尽相同,其中cell1,2为结构阵列,cell2,3为另一个单元阵列

34、。第六章 数据阵列类型与结构 6.3.1 建立单元阵列建立单元阵列建立单元阵列有两种方法:使用赋值语句。使用cell函数预分配阵列,然后再对单元赋值。第六章 数据阵列类型与结构 1利用赋值语句建立单元阵列利用赋值语句建立单元阵列利用赋值语句可对一个单元阵列进行赋值,与一般阵列赋值时使用方括号不同,它应使用花括号,花括号可出现在赋值号右边,也可以出现在左边。例如,建立22单元阵列A,可输入A(1,1)=143;058;729;A(1,2)=AnneSmith;A(2,1)=3+7i;A(2,2)=-pi:pi/10:pi;第六章 数据阵列类型与结构 为得到同样的单元阵列A,也可以输入A1,1=1

35、43;058;729;A1,2=AnneSmith;A2,1=3+7i;A2,2=-pi:pi/10:pi;第六章 数据阵列类型与结构 应该注意,在建立单元阵列之前应确保不存在同名的数值阵列。如果在建立单元阵列时已存在同名阵列,则MATLAB试图“混合”单元阵列与数值阵列,从而导致错误。类似地,如果已存在单元阵列,则在对该同名阵列简单赋值时并不能清除单元阵列。显示单元阵列可直接输入阵列名,也可采用celldisp和cellplot函数。例如:AA=3x3doubleAnneSmith3.0000+7.0000i1x21doublecelldisp(A)第六章 数据阵列类型与结构 A1,1=14

36、3058729A2,1=3.0000+7.0000iA1,2=AnneSmithA2,2=Columns1through8-3.1416-2.8274-2.5133-2.1991-1.8850-1.5708-1.2566-0.9425Columns9through16-0.6283-0.314200.31420.62830.94251.25661.5708Columns17through211.88502.19912.51332.82743.1416第六章 数据阵列类型与结构 如果输入cellplot(A)则可显示出如图6.7所示的图形。第六章 数据阵列类型与结构 2利用利用cell函数定义单

37、元阵列函数定义单元阵列cell函数可预分配单元阵列,但其内容为空阵列。例如,建立23的单元阵列,可输入B=cell(2,3);然后利用赋值语句可以给各个单元赋值,如输入B(1,3)=1:4;B(2,2)=rand(3,3);BB=1x4double3x3double第六章 数据阵列类型与结构 图6.7单元阵列显示第六章 数据阵列类型与结构 6.3.2 单元阵列数据的使用单元阵列数据的使用利用单元阵列的下标可访问单元阵列元素。例如:N1,1=12;45;N1,2=Name;N2,1=2-4i;N2,2=7;则可有CC=Named=N1,1(2,2)d=5第六章 数据阵列类型与结构 我们还可以从已

38、定义的单元阵列中取出一部分构成新的单元阵列,比如在上面的基础上再输入N3,1=No1;N3,2=No2;N3,3=No3;NN=2x2doubleName2.0000-4.0000i7No1No2No3第六章 数据阵列类型与结构 这表示N为33单元阵列,未输入的单元为空阵列。如果输入M=N(1:3,1:2)M=2x2doubleName2.0000-4.0000i7No1No2这说明M是取N中的(1:3,1:2)的元素构成的新的单元阵列。第六章 数据阵列类型与结构 单元阵列中元素的删除与其它阵列类似,例如,为删除N的第3列,可输入N(:,3)=;这时得到的N与M相同。为删除N中(2,3)的元素

39、,应输入N2,3=;注意这两种格式在使用花括号和圆括号上的细微区别。第六章 数据阵列类型与结构 利用reshape函数也可以改变单元阵列的结构,例如:A=cell(3,4);size(A)ans=34B=reshape(A,6,2);size(B)ans=62第六章 数据阵列类型与结构 6.3.3 利用单元阵列取代变量列表利用单元阵列取代变量列表单元阵列可以取代函数输入、函数输出、显示操作和阵列构造(方括号和花括号内)中的变量列表。如果在花括号内采用冒号操作符指示多个单元,则相当于指示多个独立的单元内容,例如,T1:5指示单元阵列T中第1个到第5个元素。例如考虑C阵列c(1)=123;c(2)

40、=259;c(3)=0:2:10;c(4)=-482;c(5)=4;第六章 数据阵列类型与结构 为求出向量c(1)和c(2)的卷积,可输入d=conv(c1:2)d=29253327显示出向量c(2),c(3),c(4)c2:4ans=259ans=0246810ans=-482第六章 数据阵列类型与结构 构造新的数值阵列BB=c1;c2;c4B=123259-482求矩阵B的特征向量和特征值D1:2=eig(B)D=3x3double3x3double第六章 数据阵列类型与结构 显示出特征向量和特征值D1ans=-0.1592-0.79150.2958-0.6645-0.46280.7945

41、0.73010.39930.5304D2ans=-4.40900000.656100011.7529第六章 数据阵列类型与结构 6.3.4 单元阵列应用于函数和操作符单元阵列应用于函数和操作符 利用下标可将函数和操作符应用于单元阵列。例如:A1,1=pascal(3);A1,2=randn(4,4);A1,3=0:0.1:1;A1,4=12;73;求A1,1的和值M1=sum(A1,1)M1=3610第六章 数据阵列类型与结构 通过循环可对所有单元进行处理,例如计算各单元的均值fori=1:length(A)Mi=mean(A1,i);endcelldisp(M)M1=1.00002.0000

42、3.3333M2=-0.42130.29900.26030.3931M3=0.5000M4=3.00002.5000第六章 数据阵列类型与结构 利用各种操作符对单元阵列进行处理,例如为求出A1,2中其值落在-0.5,0.5区间的元素,可输入L=abs(A1,2)newdata,name=deal(TEST1:2);而对结构阵列的访问:newdata=TEST.measure;name=TEST.name;在函数中经常使用的变量varargin和varargout是单元阵列应用的两个示例,它们可替代以逗号间隔的变量列表。例如,对于33的数值矩阵A=012;407;312;第六章 数据阵列类型与结

43、构 利用normest函数可计算出A的2范数估值及其迭代计算的次数,其输出可直接赋值给单元变量:B1:2=normest(A)B=8.88264其中B1为A的2范数,B2为迭代计算次数。第六章 数据阵列类型与结构 6.3.6 嵌套单元阵列嵌套单元阵列一个单元阵列中可以包含另一个单元阵列,甚至可包含单元阵列的阵列,这称之为单元阵列的嵌套。利用花括号、cell函数及赋值语句可建立嵌套的单元阵列。建立嵌套的单元阵列可以使用花括号,例如输入A(1,1)=magic(5);A(1,2)=第二层12;34;-pipi第三层17;第六章 数据阵列类型与结构 这样就建立了嵌套单元阵列,我们可查看其结构AA=5

44、x5double2x2cell这说明在A1,2上为一个22的单元阵列,再显示其结构A1,2ans=第二层2x2double1x2double1x2cell第六章 数据阵列类型与结构 发现在A1,22,2上仍为单元阵列A1,22,2ans=第三层17因此建立的阵列A为三层嵌套的单元阵列。第六章 数据阵列类型与结构 利用cell函数也可以建立嵌套的单元阵列,例如:B=cell(1,2);B(1,2)=cell(2,2);B(1,1)=magic(5);B1,2(1,1)=第二层;B1,2(1,2)=12;34;B1,2(2,1)=-pipi;B1,2(2,2)=第三层17;这时得到的B阵列与A一样

45、,也是三层嵌套的单元阵列。第六章 数据阵列类型与结构 6.3.7 单元阵列与数值阵列之间的变换单元阵列与数值阵列之间的变换单元阵列与数值阵列之间的变换应采用循环程序。num=15*randn(4,3,5);N=prod(size(num);c=cell(1,N);fori=1:Nci=num(i);endc=reshape(c,size(num);第六章 数据阵列类型与结构 通过显示数值阵列num和单元阵列c的相应单元的内容来确定转换的有效性:num(:,:,3)ans=-10.3766-21.614512.234312.87008.567210.678618.8100-5.998319.35

46、37-23.905910.350010.0290c(:,:,3)ans=-10.3766-21.614512.234312.87008.567210.678618.81005.998319.3537-23.905910.350010.0290第六章 数据阵列类型与结构 另外,还可以采用num2cell函数进行从数值到单元阵列的变换:c1=num2cell(num,12);c13ans=-10.3766-21.614512.234312.87008.567210.678618.8100-5.998319.3537-23.905910.350010.0290第六章 数据阵列类型与结构 相反,也可以

47、将单元阵列变换成数值阵列:m,n,p=size(num);fork=1:pfori=1:mforj=1:nnum1(i,j,k)=c1k(i,j);endendendnum1(:,:,3)ans=-10.3766-21.614512.234312.87008.567210.678618.8100-5.998319.3537-23.905910.350010.0290第六章 数据阵列类型与结构 6.4 复杂矩阵结构复杂矩阵结构 6.4.1 多维单元阵列多维单元阵列与数值阵列类似,多维单元阵列是二维单元阵列模型的扩展,这可利用cat函数连接产生。例如,下列程序产生了一个简单的三维单元阵列C:第六章

48、 数据阵列类型与结构 A1,1=12;45;A1,2=Name;A2,1=2-4i;A2,2=7;B1,1=Name2;B1,2=3;B2,1=0:1:3;B2,2=45;C=cat(3,A,B)size(C)ans=222第六章 数据阵列类型与结构 图6.8多维单元阵列结构第六章 数据阵列类型与结构 6.4.2 多维结构阵列多维结构阵列多维结构阵列是长方形结构阵列的推广,与其它类型的多维阵列一样,多维结构阵列可利用直接赋值或cat函数产生。例如:第六章 数据阵列类型与结构 patient(1,1,1).name=JohnDoe;patient(1,1,1).billing=127.00;pa

49、tient(1,1,1).test=797573;180178177.5;220210205;patient(1,2,1).name=Annane;patient(1,2,1).billing=28.5;patient(1,2,1).test=687068;118118119;172170169;patient(1,1,2).name=ASmith;patient(1,1,2).billing=504.70;patient(1,1,2).test=808080;153153154;181190182;patient(1,2,2).name=DoraJones;patient(1,2,2).bi

50、lling=1173.90;patient(1,2,2).test=737375;103103102;201198200;第六章 数据阵列类型与结构 这时,得到了一个三维的结构阵列,即输入patientpatient=122structarraywithfields:namebillingtest第六章 数据阵列类型与结构 图6.9多维结构阵列的结构第六章 数据阵列类型与结构 定义了多维结构阵列后,就可以利用结构的域名来访问,还 可 以 对 其 数 据 应 用 函 数 和 操 作 符 。 例 如 , 可 求 出patient(1,1,2)中test阵列的列和:sum(patient(1,1,2

51、).test)ans=414423416类似地,可求出所有患者的医疗费:sum(patient.billing)ans=1.8341e+003第六章 数据阵列类型与结构 6.4.3 结构的单元阵列结构的单元阵列利用单元阵列可将具有不同域结构的结构阵列存储在一起。例如:c_str=cell(1,2);c_str1.label=12/2/94-12/5/94;c_str1.obs=47525548;17223511;c_str2.xdata=-0.030.411.982.1217.11;c_str2.ydata=-351809;c_str2.zdata=0.60.812.23.4;c_strc_s

52、tr=1x1struct1x1structc_str1第六章 数据阵列类型与结构 ans=label:12/2/94-12/5/94obs:2x4doublec_str2ans=xdata:-0.03000.41001.98002.120017.1100ydata:-351809zdata:0.60000.800012.20003.4000第六章 数据阵列类型与结构 图6.10多个结构的单元阵列第六章 数据阵列类型与结构 6.4.4 综合设计示例综合设计示例设某高等学校某系两个年级共有八个班(29912994,29812984),某年度由五位教师共开设了九门课程,设置情况如表6.2所示。第六章

53、 数据阵列类型与结构 表表6.2 课程设置情况课程设置情况 第六章 数据阵列类型与结构 表表6.3 教师教学情况教师教学情况 第六章 数据阵列类型与结构 表表6.4 考试平均成绩统计表考试平均成绩统计表 第六章 数据阵列类型与结构 要求设计MATLAB程序保存这些结构,计算(1)各个班的学分加权平均成绩,计算公式为(2)各教师的教学工作量,计算公式为教学工作量=学时(1+w)其中x=人数-40第六章 数据阵列类型与结构 对于这样一个比较复杂的任务,最好采用数据库软件加以设计,然而也可以利用MATLAB提供的多维阵列、结构阵列、单元阵列功能来进行设计,为此先对这三种阵列作一简要总结:多维阵列适用

54、于规则的数据,比如有多项同维数的测量数据。结构阵列适用于不一致的数据,常见的有字符数据和数值数据混合的情况。单元阵列则可用于任意的数据混合情况,而且可将多维阵列、结构阵列纳入其中,构成非常复杂的数据结构。第六章 数据阵列类型与结构 在本例中,先利用结构阵列构造三个基本信息阵列:课程基本信息Course。教师基本信息Teacher。学生班基本信息Student。第六章 数据阵列类型与结构 然后利用单元阵列构造教学基本信息的多维单元阵列TS。最后根据要求在TS中查找有关信息,并配合Course、Teacher、Student结构计算出学生班的学分加权平均成绩和教师的教学工作量。MATLAB程序如下

55、:clear课程基本信息Course.name=高等数学;Course.score=5;Course.time=90;Course(2).name=普通物理;Course(2).score=4;Course(2).time=80;第六章 数据阵列类型与结构 Course(3).name=英语(1);Course(3).score=3;Course(3).time=64;Course(4).name=英语(2);Course(4).score=3;Course(4).time=64;Course(5).name=计算机应用基础;Course(5).score=3;Course(5).time=6

56、4;Course(6).name=电路分析基础;Course(6).score=4;Course(6).time=80;Course(7).name=低频电子线路;Course(7).score=4;Course(7).time=80;Course(8).name=高频电子线路;Course(8).score=2;Course(8).time=46;Course(9).name=数字信号处理;Course(9).score=3;第六章 数据阵列类型与结构 Course(9).time=64;教师基本信息Teacher.name=王立伟;Teacher.posit=讲师;Teacher.age=

57、30;Teacher(2).name=赵杰;Teacher(2).posit=副教授;Teacher(2).age=36;Teacher(3).name=李志范;Teacher(3).posit=教授;Teacher(3).age=45;Teacher(4).name=陈根生;Teacher(4).posit=教授;Teacher(4).age=50;Teacher(5).name=孙兴国;Teacher(5).posit=讲师;Teacher(5).age=26;学生班基本信息第六章 数据阵列类型与结构 Student.class=2991;Student.tol=130;Student(2

58、).class=2992;Student(2).tol=56;Student(3).class=2993;Student(3).tol=45;Student(4).class=2994;Student(4).tol=118;Student(5).class=2981;Student(5).tol=125;Student(6).class=2982;Student(6).tol=53;Student(7).class=2983;Student(7).tol=40;Student(8).class=2984;Student(8).tol=106;教学基本信息(用单元阵显示)TS1=高等数学,299

59、1299229932994,3112,76.268.970.171.3;TS2=普通物理,2991299229932994,2332,60.759.255.461.2;第六章 数据阵列类型与结构 TS3=英语(1),2991299229932994,5454,60.265.458.159.2;TS4=英语(2),2981298229832984,4545,62.368.371.263.9;TS5=计算机应用基础,2991299229932994,1234,75.480.173.274.2;TS6=电路分析基础,2981298229832984,3215,66.165.468.270.0;TS7

60、=低频电子线路,2991299229932994,1143,56.959.152.357.2;TS8=高频电子线路,2981298229832984,5134,66.160.961.264.9;TS9=数字信号处理,2981298229832984,2243,77.178.969.972.1;TS=cat(3,TS1,TS2,TS3,TS4,TS5,TS6,TS7,TS8,TS9);计算8个班的学分加权平均disp1=班的学分加权平均为;第六章 数据阵列类型与结构 fori=1:8c=Student(i).class;s=0;v=0;forj=1:9k=find(TS1,2,j=c);if(i

61、sempty(k)v1=TS1,4,j(k);s1=Course(j).score;s=s+s1;v=v+v1*s1;endend第六章 数据阵列类型与结构 av=v/s;disp(num2str(c)disp1num2str(av)end计算教师工作量disp2=的教学工作量为;disp3=小时;fori=1:5c=Teacher(i).name;c1=Teacher(i).posit;g=0;forj=1:9k=find(TS1,3,j=i);if(isempty(k)第六章 数据阵列类型与结构 forl=1:length(k)cn=TS1,2,j(l)-2990;ifcnA=magic(

62、3);B=pascal(3);C=cat(4,A,B);n1=ndims(A)n1=2n2=ndims(C)n2=4第六章 数据阵列类型与结构 3ndgrid功能:为多维函数和内插产生阵列。格式:X1,X2,X3,=ndgrid(x1,x2,x3,)X1,X2,=ndgrid(x)说明:X1,X2,X3,=ndgrid(x1,x2,x3,)可将由向量x1,x2,x3,指定的域变换成阵列X1,X2,X3,,这样可用于多变量函数的计算和多维内插,输出Xi的尺寸与向量xi的尺寸有关。X1,X2,=ndgrid(x)等同于X1,X2,=ndgrid(x,x,)。第六章 数据阵列类型与结构 例如,为计算

63、函数在,区间上的值,可输入X1,X2=ndgrid(2:.2:2);Y=X1.*exp(X1.2X2.2);mesh(X1,X2,Y);title(二维曲面)第六章 数据阵列类型与结构 图6.11二维曲面第六章 数据阵列类型与结构 4permute功能:多维阵列的序列变换(即重新排列)。格式:B=permute(A,order)说明:B=permute(A,order)可对阵列A按order指定的格式重新排列,order为指定阵列A的维次序向量。例如:第六章 数据阵列类型与结构 A=12;34;B=56;78;C=cat(3,A,B)C(:,:,1)=1234C(:,:,2)=5678D=pe

64、rmute(C,321)D(:,:,1)=1256D(:,:,2)=3478第六章 数据阵列类型与结构 5ipermute功能:多维阵列的逆序列变换。格式:A=ipermute(B,order)说明:A=ipermute(B,order)是permute函数的逆变换,当采用A=permute(B,order)得到B后,利用同一个order,A=ipermute(B,order)可恢复原来的A。实际上这两个函数是同一个函数。例如,在permute函数说明示例中,已得到了D,输入第六章 数据阵列类型与结构 E=ipermute(D,321)E(:,:,1)=1234E(:,:,2)=5678这说明

65、E恢复为原来的阵列C。同样采用E=permute(D,321);也可以得到相同的结果。第六章 数据阵列类型与结构 6shiftdim功能:维数移位。格式:B=shiftdim(X,n)B,nshifts=shiftdim(X)说明:B=shiftdim(X,n)可将阵列的维进行移位。当n为正整数时,shiftdim(X,n)将X阵列的维数向左移动n位,最后维回绕至第一维;当n为负时,shiftdim(X,n)向右移动n位,并在首维上补零成单点维。例如:第六章 数据阵列类型与结构 a=cat(3,eye(2),2*eye(2),3*eye(2);b=shiftdim(a,1);c=shiftdi

66、m(a,2);d=shiftdim(a,-1);whosNameSizeBytesClassA 2x232doublearrayB2x2 32doublearrayC2x2x2 64doublearrayD2x2x2 64doublearrayE2x2x2 64doublearraya2x2x3 96doublearray第六章 数据阵列类型与结构 b2x3x2 96doublearrayc3x2x2 96doublearrayd4-D96doublearrayGrandtotalis80elementsusing640bytessize(d)ans=12 23第六章 数据阵列类型与结构 命令

67、B,nshifts=shiftdim(X)可删去首维开始的单点维。例如:e,nshifts=shiftdim(d);size(e)ans=223nshiftsnshifts=1第六章 数据阵列类型与结构 7squeeze功能:删除单点维。格式:B=squeeze(A)说明:B=squeeze(A)可删去A阵列中所有的单点维。例如,利用rand函数可产生多维阵列A=rand(2,1,7);B=squeeze(A);whosNameSizeBytesClassA2x1x7112doublearrayB2x7112doublearrayGrandtotalis28elementsusing224by

68、tes第六章 数据阵列类型与结构 8flipdim功能:阵列沿着指定维翻转。格式:B=flipdim(A,dim)说明:B=flipdim(A,dim)可完成沿着dim维的翻转操作。因此flipdim(A,1)等同于flipud(A),flipdim(A,2)等同于fliplr(A)。例如:第六章 数据阵列类型与结构 A=cat(3,12;34,56;78,90;-1-2)A(:,:,1)=1234A(:,:,2)=5678A(:,:,3)=90-1-2flipdim(A,3)ans(:,:,1)=90-1-2第六章 数据阵列类型与结构 ans(:,:,2)=5678ans(:,:,3)=12

69、34flipdim(A,2)ans(:,:,1)=2143ans(:,:,2)=6587ans(:,:,3)=09-2-1第六章 数据阵列类型与结构 6.5.2 结构阵列函数结构阵列函数1struct功能:建立结构阵列。格式:s=struct(fields1,values1,fields2,values2,)说明:s=struct(fields1,values1,fields2,values2,)可建立具有指定域名及其值的结构阵列,值阵列values1,values2,必须是相同尺寸的单元阵列或标量单元,值阵列中的元素相应地放入结构阵列中。例如:s=struct(type,big,little

70、,color,red,x,3,4);第六章 数据阵列类型与结构 这时可得到一个结构阵列s,输入s时显示1x2structarraywithfields:typecolorx第六章 数据阵列类型与结构 这说明s阵列有三个域(type,color,x),有两个结构元素,可输入s(1)ans=type:bigcolor:redx:3s(2)ans=type:littlecolor:redx:4第六章 数据阵列类型与结构 2fieldnames功能:获取结构的域名。格式:names=fieldnames(s)说明:names=fieldnames(s)可得到结构阵列s的域名,其结果names为一单元阵

71、列。例如:第六章 数据阵列类型与结构 nmystr(1,1).name=alice;mystr(1,1).ID=0;mystr(2,1).name=gertrude;mystr(2,1).ID=1;n=fieldnames(mystr)n=nameID第六章 数据阵列类型与结构 3getfield功能:获取结构阵列的域值。格式:f=getfield(s,field)f=getfield(s,i,j,field,k)第六章 数据阵列类型与结构 说明:f=getfield(s,field)可获得结构阵列s中指定域的域值,这实际上等效于f=s.field。f=getfield(s,i,j,field

72、,k)可获得结构阵列元素s(i,j)中指定域的域值,这等价于f=s(i,j).field(k)。例如,给定结构mystr(1,1).name=alice;mystr(1,1).ID=0;mystr(2,1).name=gertrude;mystr(2,1).ID=1;第六章 数据阵列类型与结构 然后输入n=getfield(mystr,2,1,name)n=gertrude为列出name域的所有内容,可采用循环程序fori=1:2namei=getfield(mystr,i,1,name);endnamename=alicegertrude第六章 数据阵列类型与结构 4setfield功能:设

73、置结构阵列的域值。格式:s=setfield(s,field,v)s=setfield(s,i,j,field,k,v)说明:s=setfield(s,field,v)可将s中指定域的内容设置成v,这等效于s.field=v。s=setfield(s,i,j,field,k,v)也可将s(i,j)中指定域的内容设置成v,这等效于s(i,j).field(k)=v。例如,给定结构第六章 数据阵列类型与结构 mystr(1,1).name=alice;mystr(1,1).ID=0;mystr(2,1).name=gertrude;mystr(2,1).ID=1;然后输入mystr=setfiel

74、d(mystr,2,1,name,ted);mystr(2)ans=name:tedID:1第六章 数据阵列类型与结构 5rmfield功能:删除结构阵列中的域。格式:s=rmfield(s,field)s=rmfield(s,fields)说明:s=rmfield(s,field)可从结构阵列s中删除指定的域;s=rmfield(s,fields)可一次删除s中的多个域,其中fields为指定域名的字符阵列或字符串的单元阵列。第六章 数据阵列类型与结构 6isfield功能:检测输入是否为结构阵列的域名。格式:k=isfield(s,field)说明:在k=isfield(s,field)中

75、,当指定的field是s的域名时,k为逻辑真(其值为1)。第六章 数据阵列类型与结构 7isstruct功能:检测输入是否为结构阵列。格式:k=isstruct(s)说明:在k=isstruct(s)中,当s为结构阵列时,k为逻辑真。第六章 数据阵列类型与结构 8orderfields功能:结构阵列域名重新排序。格式:s=orderfields(s1)s=orderfields(s1,s2)s=orderfields(s1,c)第六章 数据阵列类型与结构 说明:s=orderfields(s1)对结构阵列s1中的域名重新排列,使得到的结构阵列s的域名按ASCII码顺序排列。当结构s1和s2具有

76、相同的域名(其次序可能不同)时,s=orderfields(s1,s2)可以得到对s1中的域名重新排列的结构s,其域名次序与s2相同。s=orderfields(s1,c)可按单元阵列c所指定的次序对结构s1的域名进行重新排列,注意,c中指出的域名必须与结构s1中的域名一致。第六章 数据阵列类型与结构 6.5.3 单元阵列函数单元阵列函数1cell功能:建立单元阵列。格式:c=cell(n)c=cell(m,n,p,)c=cell(m,n)c=cell(mnp)c=cell(mn)c=cell(size(A)第六章 数据阵列类型与结构 说明:c=cell(n)可产生nn的空单元阵列,当n为非标

77、量时,MATLAB给出出错信息。c=cell(m,n)和c=cell(mn)可产生mn的空单元阵列,变量m,n也必须为标量。c=cell(m,n,p,)和c=cell(mnp)可产生mnp维的空单元阵列。c=cell(size(A)可产生与A同维的空单元阵列。例如:第六章 数据阵列类型与结构 A=rand(2,3)A=0.95010.60680.89130.23110.48600.7621B=cell(size(A)B=第六章 数据阵列类型与结构 2celldisp功能:显示单元阵列的内容。格式:celldisp(C)celldisp(C,name)说明:celldisp(C)可显示出单元阵列

78、C的内容。celldisp(C,name)在显示时以指定的字符串name代替单元阵列名。例如输入第六章 数据阵列类型与结构 C=12Tony3+4i;12;34-5abc;celldisp(C)C1,1=12C2,1=1234C1,2=TonyC2,2=-5C1,3=3.0000+4.0000iC2,3=abc第六章 数据阵列类型与结构 3cellplot功能:以图形方式显示出单元阵列的结构。格式:cellplot(c)cellplot(c,legend)handles=cellplot()第六章 数据阵列类型与结构 说明:cellplot(c)可以以图形方式表示c的内容,阵列和向量采用色块表

79、示,标量和短的文本字符串则直接进行显示。在cellplot(c,legend)中还可在单元阵列图的右边给出图例文本。handles=cellplot()除画出单元阵列图之外,还返回图形句柄handles。第六章 数据阵列类型与结构 4num2cell功能:数值阵列变换成单元阵列。格式:c=num2cell(A)c=num2cell(A,dim)第六章 数据阵列类型与结构 说明:c=num2cell(A)可将阵列A的元素放入相应单元阵列c的位置,c的尺寸与A相同。c=num2cell(A,dim)可将阵列A放入单元阵列c,并将A的指定维dim放入独立的单元中。例如输入A=rand(2,3)A=0

80、.95010.60680.89130.23110.48600.7621num2cell(A)ans=第六章 数据阵列类型与结构 0.95010.60680.89130.23110.48600.7621c1=num2cell(A,1)c1=2x1double2x1double2x1doublec2=num2cell(A,2)c2=1x3double1x3double第六章 数据阵列类型与结构 5cell2struct功能:单元阵列变换成结构阵列。格式:s=cell2struct(c,fields,dim)说明:s=cell2struct(c,fields,dim)可将单元阵列的指定维转变成域名为

81、fields的结构s,因此c在dim维的长度必须与域名的数目相同。变量fields可以是字符阵列,也可以是字符串的单元阵列。例如输入第六章 数据阵列类型与结构 c=tree,37.4,birch;f=category,height,name;s=cell2struct(c,f,2)s=category:treeheight:37.4000name:birch第六章 数据阵列类型与结构 6struct2cell功能:结构阵列变换成单元阵列。格式:c=struct2cell(s)说明:c=struct2cell(s)可将mn的结构s(有p个域)变换成pmn的单元阵列c。如果s是多维的,则单元阵列c

82、具有的尺寸为psize(s)。例如输入第六章 数据阵列类型与结构 s.height=37.4;s.name=birch;s(2).category=tree;s(2).height=3.8;s(2).name=peach;c=struct2cell(s);size(c)ans=312celldisp(c)c1,1,1=tree第六章 数据阵列类型与结构 c2,1,1=37.4000c3,1,1=birchc1,1,2=treec2,1,2=3.8000c3,1,2=peach第六章 数据阵列类型与结构 7iscell功能:检测单元阵列。格式:k=iscell(c)说明:在k=iscell(c)

83、中,当c为单元阵列时,k为逻辑真(其值为1)。第六章 数据阵列类型与结构 8cellstr功能:从字符阵列中建立单元阵列。格式:c=cellstr(S)说明:c=cellstr(S)可将字符阵列S中的每一行放入c的独立单元中,从而构成单元阵列c。利用string函数可完成与此相反的转换。例如,先构成字符串SS=strvcat(abcd,efgh,ok)S=abcdefghok第六章 数据阵列类型与结构 然后将它变换成单元阵列c=cellstr(S)c=abcdefghok第六章 数据阵列类型与结构 9deal功能:输入分配给输出。格式:Y1,Y2,Y3,=deal(X)Y1,Y2,Y3,=de

84、al(X1,X2,X3,)说明:Y1,Y2,Y3,=deal(X)可将单个输入分配给每个输出,即等同于Y1=X,Y2=X,Y3=X,;Y1,Y2,Y3,=deal(X1,X2,X3,)等同于Y1=X1,Y2=X2,Y3=X3,。第六章 数据阵列类型与结构 但应注意,deal函数应用于单元阵列和结构时具有特殊的用途,这里给出一些有用的指令:S.field=deal(X),可将结构S中的所有由field指定的域设置成值X,当S不存在时,应使用S(1:m).field=deal(X)命令。X:=deal(A.field)可将结构A中由field指定的域值复制 到 单 元 阵 列 X中 , 当 X不

85、存 在 时 , 应 采 用X1:m=deal(A.field)命令。Y1,Y2,Y3,=deal(X:)可将单元阵列X的内容复制到各个独立变量Y1,Y2,Y3,。Y1,Y2,Y3,=deal(S.field)可将结构S中由field指定的域值复制到Y1,Y2,Y3,。第六章 数据阵列类型与结构 例如,将四单元阵列复制到四个独立输出变量C=rand(3),ones(3,1)eye(3)zeros(3,1);a,b,c,d=deal(C:)a=0.93550.89360.81320.91690.05790.00990.41030.35290.1389b=111第六章 数据阵列类型与结构 c=100

86、010001d=000第六章 数据阵列类型与结构 利用deal函数可获得结构中指定域的域值A.name=Pat;A.number=176554;A(2).name=Tony;A(2).number=901325;name1,name2=deal(A(:).name)name1=Patname2=Tony第六章 数据阵列类型与结构 10cellfun 功能:将函数应用于单元阵列中的每个元素。格式:D=cellfun(fname,C)D=cellfun(size,C,k)D=cellfun(isclass,C,classname)第六章 数据阵列类型与结构 说明:D=cellfun(fname,C

87、)可将函数fname应用于单元阵列C中的每个元素,得到的结果D为普通的双精度阵列,其尺寸与C一致。这里支持的函数有isempty:当C为空单元阵列时返回真值。islogical:当C为逻辑单元阵列时返回真值。isreal:当C为实数单元阵列时返回真值。length:返回单元阵列的长度。ndims:返回单元阵列的维数。prodofsize:返回单元阵列的元素个数。第六章 数据阵列类型与结构 D = cellfun(size, C, k)可以得到C中第k维的尺寸;D=cellfun(isclass, C, classname)中,当C的每个元素都与classname(类别)一致时,D为真。例如,先

88、产生一个23的单元阵列C1,1=12;45;C1,2=Name;C1,3=pi;C2,1=2+4i;C2,2=7;C2,3=magic(3);第六章 数据阵列类型与结构 然后有D=cellfun(isreal,C)D=111011len=cellfun(length,C)len=241113isdbl=cellfun(isclass,C,double)isdbl=101111第六章 数据阵列类型与结构 11mat2cell 功能:将矩阵分拆成单元阵列。格式:c=mat2cell(x,m,n)c=mat2cell(x,d1,d2,d3,dn)c=mat2cell(x,r)第六章 数据阵列类型与结

89、构 说明:c=mat2cell(x,m,n)可以将二维矩阵x分拆成单元阵列c,其向量m和n分别用于指定行和列的分拆数。例如,设x为6050的矩阵,则c=mat2cell(x,102030,2525)可以产生32的单元阵列:c=10x25double10x25double20x25double20x25double30x25double30x25double第六章 数据阵列类型与结构 命令c=mat2cell(x,d1,d2,d3,dn)可以将多维阵列x分拆成单元阵列,其中d1dn用于指定各个维的分拆数。c=mat2cell(x,r)可以将矩阵x分拆成一维的单元阵列,其中向量r用于指定行的分拆数

90、。例如:x=rand(5,6);r=23;c=mat2cell(x,r)c=2x6double3x6double第六章 数据阵列类型与结构 12cell2mat 功能:将单元阵列恢复成矩阵。格式:x=cell2mat(c)说明:函数cell2mat是mat2cell的逆函数,x=cell2mat(c)可以将多维单元阵列变换成阵列x。参见mat2cell函数。第六章 数据阵列类型与结构 习习 题题 1在一个552.5m3的房间里,按每间隔50cm的栅格测定各点的温度(可随机产生),建立多维阵列表示,并求出高度从02.5m每隔50cm的平面上的平均温度。2某学期期末共进行了5门课程的考试。为开展宿

91、舍之间的竞赛,要求将一个宿舍中n(n=68)个人的5门课的成绩组合成二维阵列。假设你的班共有10个宿舍,从1到10编号,将所有宿舍学生成绩组合成三维阵列,求出每个宿舍的平均成绩,并排列出名次。第六章 数据阵列类型与结构 3每个学生在学习过程中,可设计一种单元阵列来记录自己每学期的学习情况。存储内容包括基本信息(姓名、出生年月、籍贯、联系电话、信箱号等)、课程信息(课程名称、任课老师、教材、学时、学分、成绩等)、其它信息(如担任职务、发表文章、参加竞赛、毕业设计等)。根据这些内容设计出单元阵列,并计算出每学期的学分加权平均成绩。扩展这种单元阵列到全宿舍同学,构成多维的单元阵列,并根据学分加权平均成绩排列名次。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号