资源预览内容
第1页 / 共24页
第2页 / 共24页
第3页 / 共24页
第4页 / 共24页
第5页 / 共24页
第6页 / 共24页
第7页 / 共24页
第8页 / 共24页
第9页 / 共24页
第10页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
MATLAB 程序设计与应用 结构数组MATLAB 程序设计入门篇:结构数组n马新生n南昌大学数学系 13-1结构数组的建立n每一个结构数组(Structure Array)可 以包含很多个元素,每一个元素可以看 成是一笔数据。因此每个元素可以包含 数个字段(Fields),而每个字段可包 含各个不同型态的数据。例如一个包含 学生个人数据的结构数组,可能含有的 字段是 name(学生姓名)、id(学号 )、scores(小考成绩)等。要建立此 种结构,可在指令列直接输入个字段的 值。MATLAB 程序设计入门篇:结构数组n马新生n南昌大学数学系 结构数组之范例一n范例13-1 : struct01.m clear student%清除student变数 student.name = 洪鹏翔;% 加入 name 字段 student.id = mr871912;% 加入 id 字段 student.scores = 58, 75, 62;% 加入 scores 字段 student% 秀出结果 student =name: 洪鹏翔id: mr871912scores: 58,75,62n此时student即代表一个结构数组的第一个元素,或是第一笔数 据。MATLAB 程序设计入门篇:结构数组n马新生n南昌大学数学系结构数组之范例二n范例13-2 : struct02.m clear student% 清除 student 变数 student.name = 洪鹏翔;% 加入 name 字段 student.id = mr871912;% 加入 id 字段 student.scores = 58, 75, 62;% 加入 scores 字段 % 以下是新加入的第二笔数据 student(2).name = 邱中人; student(2).id = mr872510; student(2).scores = 25, 36, 92; student%秀出结果 student = 1x2 struct array with fields:NameIdscores dent = 1x2 struct array with fields:NameIdscoresMATLAB 程序设计入门篇:结构数组n马新生n南昌大学数学系结构数组之范例二n此时student即代表一个12的结构数组。由于此结构数 组已渐趋复杂,MATLAB并不将所有字段值印出。欲显示 某元素的特定字段值,可输入明确的叙述,例如 student(2).scores等。n另一个建立结构数组的方法,则是使用struct指令,其格 式如下: structureArray = struct(field1, value1, field2, value2,.)n其中field1、field2、是字段名称,value1、value2、 则是字段所包含的数据。如果value1、value2、为异质 数组(Cell Arrays,详见第上一章),则MATLAB为依序 将异质数组的每个元素设定为每一个结构中相对应的字 段值,如以下范例13-3:MATLAB 程序设计入门篇:结构数组n马新生n南昌大学数学系结构数组之范例三n范例13-3 : struct03.m student = struct(name, 张庭硕, 张庭安, scores, 50 60, 60 70); student(1)% 显示 student(1) student(2)% 显示 student(2) ans = name: 张庭硕 scores: 50 60 ans =name: 张庭安scores: 60 70n在上述使用法中,张庭硕, 张庭安 和50 60, 60 70都是异质数组,因此他们的每个元素会被依次设定到每个结 构之中。但是如果其中有一个异值数组的长度是1,那么MATLAB 会进行纯量展开(Scalar Expansion)来自动补足,如以下范 例13-4:MATLAB 程序设计入门篇:结构数组n马新生n南昌大学数学系结构数组之范例四n范例13-4 : struct04.m student = struct(name, 张庭安,scores, 50 60, 90 100); student(1)% 显示 student(1) student(2)% 显示 student(2) ans =name: 张庭安scores: 50 60 ans =name: 张庭安scores: 90 100n在上述范例中,张庭安可视为异质数组的一个元素,因此在 设定至student结构数组时,MATLAB会进行纯量展开,将张庭 安分别设定到student的两个元素的name字段值。MATLAB 程序设计入门篇:结构数组n马新生n南昌大学数学系结构数组之范例五n结构数组可以是巢状式(Nested)的,也就是说,结构数组的字 段可是另一个结构数组,我们可以藉此产生复杂的数据结构n范例13-5 : struct05.m student = struct(name, 张庭硕, 张庭安, scores, 50 60, 60 70); student(2).course(1).title = Web Programming; student(2).course(1).credits = 2; student(2).course(2).title = Numerical Method; student(2).course(2).credits = 3; student(2).course ans = 1x2 struct array with fields:title creditsMATLAB 程序设计入门篇:结构数组n马新生n南昌大学数学系13-2取用及改变结构数组的数 据Student结构数组Student(1)Student(2)Student(3).name=banny.scores=85,80,92,78.name=joey.scores=80,85,90,88.name=batty.scores=88,82,90,80n范例13-6 : buildStruct01.m clear student% 清除 student 变数 student(1) = struct(name, Banny, scores, 85,80,92,78); student(2) = struct(name, Joey, scores, 80,85,90,88); student(3) = struct(name, Betty, scores, 88,82,90,80);n上述的student结构数组,可图标如下:MATLAB 程序设计入门篇:结构数组n马新生n南昌大学数学系Struct2cell指令n欲取用结构数组中所有元素内所有字段的数据,可用 struct2cell指令,例如: values = struct2cell(student) values(:,:,1) =Banny1x4 double values(:,:,2) =Joey1x4 double values(:,:,3) =Betty1x4 doublen请注意,传回的values是一个异质数组。一般而言,若输入 struct2cell指令的结构变量维度为mn,且包含p个字段,则传 回异质数组的维度为pmn。(在上例中,p = 2,m = 1, n = 3。)MATLAB 程序设计入门篇:结构数组n马新生n南昌大学数学系改变结构数组内容n在结构数组中,我们可以使用句点(”.”)来找出某一 笔数据内的某一个特定字段值,例如我们仅想看看第二个学生 是谁,此时我们可以输入: studentName = student(2).name studentName = Joeyn在上例中,在此一学生结构数组的第二数组元素student(2)之 后加上一点,再接上姓名字段名称name,即可取用此学生的实 际姓名资料Joey,本例中进一步再将取出的学生姓名Joey储存 在使用者自设的变量studentName之后显示于屏幕上。n类似取用结构数组个别字段数据内容的作法,我们可以改变结 构数组中个别字段的数据内容,例如: student(2).name = Alex;n在上例中,student(2)的姓名已由原先的Joey改变为Alex。MATLAB 程序设计入门篇:结构数组n马新生n南昌大学数学系CAT指令nMATLAB提供了cat指令,以达到并排字段值的目的,其语 法为: A = cat(dim, structureField) 其中,dim代表并排后所改变的维度。例如,欲将小考成绩左 右(水平)并排,可输入: cat(2, student.scores)% 2 代表左右并排以改变直行的维度 ans = 85 80 92 78 80 85 90 88 88 82 90 80n欲将小考成绩上下(垂直)并排,可输入: cat(1, student.scores)% 1 代表上下并排以改变横列的维度 ans = 85 80 92 7880 85 90 8888 82 90 80MATLAB 程序设计入门篇:结构数组n马新生n南昌大学数学系计算平均n在进行并排时,必须确认被并排的字段值有相同的行数( 上下并排)或列数(左右并排),否则就会因为维度不和而产 生错误讯息。n若要计算每次考试(共四次)的平均分数,可输入: average1 = mean(cat(1, student.scores) average1 =84.3333 82.3333 90.6667 82.0000n若要计算每位学生(共三位)的平均分数,可输入下列表达式 ,但注意表达式后面单引号的使用代表矩阵的转置( Transpose),因为mean指令是对矩阵的每一直行进行平均值 运算: average2 = mean(cat(1,student.scores) average2 =83.7500 85.7500 85.0000MATLAB 程序设计入门篇:结构数组n马新生n南昌大学数学系并排运算n由于并排运算常被用到,MATLAB又提供下列两种方法n方括号运算:可以左右合并结构数组中相同字段的数值矩 阵,产生一个新的数值矩阵。n大括号运算:可以左右合并结构数组中相同字段的数据, 产生一个异值矩阵。n若要把scores字段值进行左右合并,可以输入如下: allScores = student.scores allScores =85 80 92 78 80 85 90 88 88 82 90 80n若要把name字段值抽取出来,形成由字符串组成的异值数组, 可以输入如下: allNames = student.name allNames =Banny Alex BettyMATLAB 程序设计入门篇:结构数组n马新生n南昌大学数学系结构数组之范例七范例13-7 : printStruct01.mclear student% 清除 student 变数 student(1) = struct(name, 张庭硕, scores, 85, 80); student(2) = struct(name, 锺书蓉, scores,
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号