




已阅读5页,还剩81页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MATLAB 程序设计语言,任课教师:李靖 博士(讲师),Email:,研究方向:无线通信,2,Chapter6 数据阵列类型与结构,多维阵列 结构阵列 单元阵列 复杂阵列结构 多维阵列、结构阵列和单元阵列函数,3,6.1 多维阵列,多维阵列 建立多维阵列 多维阵列信息 多维阵列的使用 多维阵列计算 多维阵列的数据组织,4,6.1.1-2 多维阵列及其建立,多维阵列是二维矩阵的推广 多维阵列使用3个以上的下标来访问 多维阵列的建立: 1. 利用下标建立多维阵列; 2. 利用matlab函数产生多维阵列; 3. 利用cat函数建立多维阵列; 4. 用户自己编写M文件产生多维阵列。,5,利用下标建立多维阵列,例6.1 有两个二维矩阵A和B A = B = 1 2 3 11 12 13 4 5 6 14 15 16 可以很容易地构造一个三维矩阵C : C (:,:,1 ) = A; C (:,:,2 ) = B; 给出: C (:,:,1 )= C (:,:,2 ) = 1 2 3 11 12 13 4 5 6 14 15 16,6,利用matlab函数产生多维阵列,利用rand, randn, ones, zeros产生多维阵列,且在函数调用时指定每一维的尺寸。 例6.2 输入R = randn(3, 4, 2), 给出: R(:,:,1) = 0.4694 -0.6275 -0.2037 1.5929 -0.9036 0.5354 -2.0543 1.0184 0.0359 0.5529 0.1326 -1.5804 R(:,:,2) = -0.0787 -1.2344 0.0558 0.3710 -0.6817 0.2888 -0.3679 0.7283 -1.0246 -0.4293 -0.4650 2.1122 另外,A = ones(4,3,2); B = repmat(3, 3,2,2);,7,利用cat函数建立多维阵列,可将任何两个维数适当的阵列按指定维数进行连接,从而产生更高维阵列 例6.3 A = B = 1 2 5 6 3 4 7 8,C = cat(1, A, B) C = 1 2 3 4 5 6 7 8,C = cat(2, A, B) C = 1 2 5 6 3 4 7 8,C = cat(3, A, B) C(:,:,1) = 1 2 3 4 C(:,:,2) = 5 6 7 8,8,6.1.3 多维阵列信息,ndims 获得多维阵列维数 size 得到阵列各维的尺寸 whos 得到阵列的存储和格式,9,6.1.4 多维阵列的使用(P269),下标访问技术 阵列重新排列 阵列的序列变换,10,6.1.5 多维阵列计算,面向向量的函数: sum, mean, cross 面向元素的函数: 三角函数、指数函数等 (可按对二维阵列的操作方式对多维阵列处理) 算术、逻辑和关系运算符 面向矩阵的函数: 线性代数函数和矩阵函数,11,6.1.6 多维阵列的数据组织,多维阵列可表示两类数据: 表示成二维数据的平面或页,可将页当作矩阵处理; 表示成多变量或多维数据。(例P272),12,6.2 结构阵列,结构阵列由多个域构成,每个域可以存放各种类型的数据,例如,第一个域为用字符串表示的学生名字,第二个域为用标量表示的学生学号,第三个域为数值矩阵表示的学生成绩。,13,6.2.1 建立结构阵列,利用赋值语句,对结构阵列的各个域进行赋值。 例: = Zhang San; student.number = 001; student.score = 81 79 92 85 94 71;,14,6.2.1 建立结构阵列,利用struct函数建立结构阵列 例: student1 = struct (name, Zhang San, number, 001, score, 81 79 92 85 94 71) 例:ex1.m,15,6.2.2 结构阵列数据的使用,在结构阵列中,利用结构名后的括号指示第n个结构元素,利用句点引出域名指示相应的域。 str = student(1).name; 可采用循环得到多个域的值。 getfield, setfield getfield(student,2,name) student=setfield(student,2, number,003),16,6.2.3 结构阵列应用于函数和操作符,例:mean (student(1).score) ans = 83.6667,17,6.2.4 结构阵列的数据组织(p277),平面组织:结构的每个域是整个图像平面 优点:易扩展到多个平面或图像 缺点:访问平面的子集比较麻烦 元素对元素组织: 优点:方便访问数据的子集 缺点:要采用循环建立结构,且访问平面数 据麻烦,18,6.2.5 结构嵌套,结构嵌套:在结构阵列中,其域值可以是另一个已经定义过 的结构 例: n = cour1, cour2, cour3; r = 88 65 79; student = struct (name, Zhang San, number, 001, course, struct(name,n,score,r) 执行后: student = name: Zhang San number: 001 course: 1x3 struct,19,6.3 单元阵列,Matlab允许将不同类型的阵列组合成一个新的阵列,这一阵列称之为单元阵列。单元阵列中的每个单元可以是标量、向量、矩阵、多维阵列、字符阵列、结构阵列等。(P282 图6.6),20,6.3.1 建立单元阵列,建立单元阵列有两种方法: 使用赋值语句 使用cell函数预分配阵列,然后再对单元赋值,21,利用赋值语句建立单元阵列,使用花括号对单元阵列进行赋值,花括号可以用在赋值语句的左边,也可以用在右边。 A1,1 = 1 2 3; 4 5 6; 7 8 9; 或 A(1,1) = 1 2 3; 4 5 6; 7 8 9; A1,2 = Tom; 或 A(1,2) =Tom;,22,利用cell函数定义单元阵列,使用cell函数预分配阵列,然后再对单元赋值 B = cell(2,3) B = B(1,2)=1:4,23,6.3.2 单元阵列数据的使用,利用单元阵列的下标可访问单元阵列元素 A1,1 = 1 2 3; 4 5 6; 7 8 9; A1,2 = Tom; A2,1 = 3+7*i; A2,2 = -pi:pi/10:pi; c = A2,1 c = 3.0000 + 7.0000i c = A1,1(2,3) c = 6,24,6.3.2 单元阵列数据的使用,从已定义单元阵列中取一部分构成新单元阵列 A2,3 = hello A = 3x3 double Tom 3.0000+ 7.0000i 1x21 double hello B=A(1:2,2:3) B = Tom 1x21 double hello 删除元素 A2,3 = % 删除A中的(2,3)的元素 A(:,3) = % 删除A中的第三列元素,25,6.3.3 利用单元阵列取代变量列表,在花括号中采用”:”操作符指示多个单元,则相当于指示多个独立的单元内容 A1:3 %单元阵列A中第1个到第3个元素 ans = 1 2 3 4 5 6 7 8 9 ans = 3.0000 + 7.0000i ans = Tom D1:2=eig(B) %求矩阵的特征向量和特征值,26,6.3.4 单元阵列应用于函数和操作符,利用下标将函数和操作符应用于单元阵列 m = prod(A1,1) m = 28 80 162 l = (abs(A1,1)=3) l = 0 0 1 1 1 1 0 0 0,27,6.3.5 单元阵列的数据组织,单元阵列对组织具有不同尺寸或类型的数据是非常有用的,它比结构更具包容性,可应用于:(p287) 利用一条语句访问多个数据域 利用逗号间隔的变量表访问数据子集 不具备固定的域名 经常从结构中删除域名,28,6.3.6 嵌套单元阵列,一个单元阵列中可以包含另一个单元阵列,甚至可包含单元阵列的阵列,称之为单元阵列的嵌套 建立单元阵列的嵌套: 嵌套的花括号、cell函数、赋值语句。 例6.4 利用嵌套的花括号建立嵌套单元阵列 例6.5 利用cell函数建立嵌套单元阵列,29,6.3.7 单元阵列与数值阵列之间的变换,采用循环程序实现转换,30,6.4 复杂阵列结构,多维单元阵列 多维结构阵列 结构的单元阵列,31,6.4.1 多维单元阵列,借助cat函数连接产生 A1,1 = 1 2 3; 4 5 6; 7 8 9; A1,2 = Tom; A2,1 = 3+7*i; A2,2 = -pi:pi/10:pi; B1,1 = hello; B1,2 = 6; B2,1 = 1:3; B2,2 = 2 4;,32,6.4.1 多维单元阵列,C = cat(3, A, B) C(:,:,1) = 3x3 double Tom 3.0000+ 7.0000i 1x21 double C(:,:,2) = hello 6 1x3 double 1x2 double,33,6.4.2 多维结构阵列,直接赋值或cat函数产生 例: student(1,1,1).name = Tom; student(1,1,1).number = 001; student(1,1,1).score = 81 79 92 85 94 71; student(1,1,2).name = Joe; student(1,1,2).number = 003; student(1,1,2).score = 64 77 69 84 76 90;,34,6.4.2 多维结构阵列,student = 1x1x2 struct array with fields: name number score avg = sum(student(1,1,2).score)/6 avg = 76.6667,35,6.4.3 结构的单元阵列,利用单元阵列可将具有不同域结构的结构阵列存储在一起。(P293 图6.10),36,6.5 多维阵列、结构阵列和单元阵列函数,多维阵列函数 结构阵列函数 单元阵列函数,37,6.5.1多维阵列函数,cat ndims ndgrid permute ipermute shiftdim squeeze flipdim,38,cat,功能:连接阵列 格式:C = cat(dim,A,B) C = cat(dim,A1,A2,A3,A4.) 说明: 将输入阵列A,B或A1,A2,A3,A4沿着dim维连接成C阵列。 cat(2,A,B) = A,B cat(1,A,B) = A;B,39,ndims,功能:求阵列维数 格式:n = ndims(A) 说明:ndims(x) = length(size(x).,40,ndgrid,功能:为多维函数和内插产生阵列 格式:X1,X2,X3,. = ndgrid(x1,x2,x3,.) X1,X2,. = ndgrid(x) 说明: 可将由向量x1,x2,x3,指定的域变换成阵列X1,X2,X3,.,用于多变量函数的计算和多维内插。 例6.6,41,permute,功能:多维阵列的序列变换(重新排列) 格式:B = permute(A,order) 说明: 对阵列A按order指定的格式重新排列。 对阵列A,permute(A,2 1)等价于A。 例6.7,42,ipermute,功能:多维阵列的逆序列变换 格式:A = ipermute(B,order) 说明:permute函数逆变换。 例6.8,43,shiftdim,功能:维数移位 格式:B = shiftdim(X,n) B,nshifts = shiftdim(X) 说明:当n为正数时, shiftdim(X,n)将X阵列的维数向左移动n位,最后维回绕至第一维;当n维负数时,将X阵列的维数向右移动n维,并在首维上补零成单点维. B,nshifts = shiftdim(X)可以删去首维开始的单点维。 例6.9,44,squeeze,功能:删除单点维 格式:B = squeeze(A) 说明:删除A阵列中的单点维 例6.10,45,flipdim,功能:阵列沿着指定维翻转 格式:B = flipdim(A,dim) 说明: 沿着dim维翻转 flipdim(A,1)等同于 flipud(A) flipdim(A,2)等同于fliplr(A) 例6.11,46,6.5.2 结构阵列函数,struct fieldnames getfield setfield emfield isfield isstruct,47,struct,功能:建立结构阵列 格式:s = struct(field1,values1,field2,values2,.) 说明:s = struct(field1,values1,field2,values2,.) 可建立具有指定域名及其值的结构阵列,值阵列values1, values2,必须是相同尺寸的单元阵列或标量单元,值阵列中的元素相应地放入结构阵列中。 例:6.12,48,fieldnames,功能:获取结构名 格式:f = fieldnames(s) 说明:names = fieldnames(s)可得到结构阵列s的域名,其结构names为一单位阵列。 例6.13,49,getfield,功能:获取结构阵列的域值。 格式: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,k)可获得结构阵列s中指定域的域值,这等价于 f s(i, j).field(k)。 例6.14,50,setfield,功能:设置结构阵列的域值 格式: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中指定域的内容设置成v,这等效于s(i,j).field(k)v 例6.15,51,rmfield,功能:删除结构阵列中的域 格式:s = rmfield(s,field) s = rmfield(s,FIELDS) 说明:s = rmfield(s,field)可从结构阵列s中删除指定的域; s = rmfield(s,FIELDS)可一次删除s中的多个域,其中FIELDS为指定域名的字符阵列或字符串的单元阵列。,52,isfield,功能:检测到结构阵列的域名时为逻辑真 格式:tf = isfield(A,field) 说明:tf = isfield(A,field)中, 当指定的field是s的域名时,k为逻辑真(其值为1)。 例6.16,53,isstruct,功能:检测到结构阵列时为逻辑真。 格式:tf = isstruct(A) 说明:tf = isstruct(A)中,当s为结构阵列时,k为逻辑真。,54,6.5.3 单元阵列函数,cell celldisp cellplot num2cell struct2cell iscell cellstr deal,55,cell,功能:建立单元阵列 格式:c = cell(n) c = cell(m,n) or c = cell(m n) c = cell(m,n,p,.) or c = cell(m n p .) c = cell(size(A) 说明: c = cell(n)可产生nn的空单元阵列,当n为非标量时,MATLAB给出出错信息。 c = cell(m,n) 和 c = cell(m n)可产生mn的空单元阵列,变量m,n也必须为标量。 c = cell(m,n,p,.) 和c = cell(m n p .)可产生mnp维的空单元阵列。 c = cell(size(A)可产生与A同维的空单元阵列。,56,celldisp,功能:显示单元阵列内容 格式:celldisp(C) 说明:celldisp(C)可显示出单元阵列c的内容。 例6.18,57,cellplot,功能:以图形方式显示出单元阵列的结构 格式:cellplot(c) cellplot(c,legend) handles = cellplot(.) 说明:cellplot(c)可以以图形形式表示c的内容,填充了颜色的方块用于表示阵列和向量的元素,标量和短的文本字串则会直接进行显示。 cellplot(c,legend)中,还可以在单元阵列图的右边,给出图例文本。 handles = cellplot(c),可在画出单元阵列图之外,还得 得到了图形句柄。,58,num2cell,功能:数值阵列变换单元阵列。 格式:c = num2cell(A) c = num2cell(A,dims) 说明:c = num2cell(A)可将阵列A的元素放入相应单元阵列c的位置,c的尺寸与A的相同。 c = num2cell(A,dims)可将阵列A放入单元阵列c,并将指定维dim放入独立的单元。 例6.19,59,cell2struct,功能:单元阵列变换成结构阵列 格式:s = cell2struct(c,fields,dim) 说明:s = cell2struct(c,fields,dim)可将单元阵列的指定维转变成域名维fields的结构s,因此c在dim维的长度必须与域名的数目相同。变量fields可以是字符阵列,也可以是字符的单元阵列。 例6.20,60,struct2cell,功能:结构阵列变换成单元阵列 格式:c = struct2cell(s) 说明:将mn结构s(有p个域)变换成pmn单元阵列c。若s多维,则c具有尺寸p size(s) 例6.21,61,iscell,功能:检测到单元阵列时为逻辑真 格式:tf = iscell(A) 说明:当A为单元阵列时,tf为逻辑真。,62,cellstr,功能:从字符阵列中建立单元阵列 格式:c = cellstr(S) 说明:将字符阵列s中的每一行放入c的独立单元中,从而构成单元阵列c。 例6.22,63,deal,功能:输入分配给输出 格式:Y1,Y2,Y3,. = deal(X) Y1,Y2,Y3,. = deal(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, 例6.23,The end,65,例6.4 利用嵌套的花括号建立嵌套单元阵列,A(1,1) = magic(5) A(1,2) = layer 2 1 2; 3 4; -pi pi layer 3 1; A A = 5x5 double 2x2 cell A1,2 ans= layer 2 2x2 double 1x2 double 1x2 cell A1,22,2 ans= layer 3 1,返回,66,例6.5 利用cell函数建立嵌套单元阵列,A = cell(1,2); A(1,1) = magic(4); A(1,2) = cell(2,2); A1,2(1,1) = layer 2; A1,2(1,2) = 1 2; 3 4; A1,2(2,1) = -pi pi; A1,2(2,2) = layer 3 1; 结果同例6.4,返回,67,例6.6 ndgrid,例6.6 计算函数 在 , 上的值。 X1,X2 = ndgrid(-2:.4:2, -2:.4:2); Z = X1 .* exp(-X1.2 - X2.2); mesh(Z);,返回,68,例6.7 permute,例6.7.1 A = 1 2; 3 4; permute(A,2 1) ans = 1 3 2 4 例6.7.2 X = rand(12,13,14); Y = permute(X,2 3 1); size(Y) ans = 13 14 12,返回,69,例6.8 ipermute,a = cat(3, eye(2), 2*eye(2), 3*eye(2) a(:,:,1) = a(:,:,2) = a(:,:,3) = 1 0 2 0 3 0 0 1 0 2 0 3 B = permute(a,3 2 1); C = ipermute(B,3 2 1); isequal(a,C) ans= 1,返回,70,例6.9 shiftdim,例6.9 a = rand(1,1,3,1,2); b,n = shiftdim(a); % b是312维且n=2. c = shiftdim(b,-n); % c = a. d = shiftdim(a,3); % d是12113维.,返回,71,例6.10 squeeze,Y = rand(2,1,3); Y = Y(:,:,1) = Y(:,:,2) = Y(:,:,3) = 0.5194 0.0346 0.5297 0.8310 0.0535 0.6711 Z = squeeze(Y); Z = 0.5194 0.0346 0.5297 0.8310 0.0535 0.6711,返回,72,例6.11 flipdim,A = 1 4 2 5 3 6 flipdim(A,1) = 3 6 2 5 1 4,返回,73,例6.12 struct,s = struct(type,big,little,color,red,x,3 4) 这时可得到一个结构阵列S s = 1x2 struct array with fields: type color x 这说明S阵列有三个域(type, color, x),有两个结构元素,可输入: s(1) s(2) ans = ans = type: big type: little color: red color: red x: 3 x:4,返回,74,例6.13 fieldnames,mystr(1,1).name = alice; mystr(1,1).ID = 0; mystr(2,1).name = gertrude; mystr(2,1).ID = 1; n = fieldnames(mystr) n = name ID,返回,75,例6.14 getfield,给定结构 mystr(1,1).name = alice; mystr(1,1).ID = 0; mystr(2,1).name = gertrude; mystr(2,1).ID = 1 然后输入:f = getfield(mystr,2,1,name) f = gertrude 为列出name域的所有内容,可采用循环程序: for k = 1:2 namek = getfield(mystr,k,1,name); end name name = alice gertrude,返回,76,例6.15 setfield,给定结构: mystr(1,1).name = alice; mystr(1,1).ID = 0; mystr(2,1).name = gertrude; mystr(2,1).ID = 1; 然后输入: mystr = setfield(mystr,2,1,name,ted); mystr(2,1).name ans = ted,返回,77,例6.16 isfield,给定结构 = John Doe; patient.billing = 127.00; patient.test = 79 75 73; 180 178 177.5; 220 210 205; 然后 isfield(patient,billing) ans = 1,返回,78,例6.18 celldisp,C = 1 2 Tony 3+4i; 1 2;3 4 -5 abc; celldisp(C) C1,1 = 1 2 C2,1 = 1 2 3 4 C1,2 = Tony C2,2 = -5 C1,3 = 3.0000+ 4.0000i C2,3 = abc,返回,79,例6.19 num2cel,A = fix(20*rand(4,4) A = 19 17 16 18 4 15 8 14 12 9 12 3 9 0 15 8 c = num2cell(A) c = 19 17 16 18 4 15 8 14 12 9 12 3 9 0 15 8
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论