MATLAB编程与应用系列-第4章 字符、元胞和结构数组(5)

本系列教程来源于出版设计《基于MATLAB编程基础与典型应用书籍》,如涉及版权问题,请联系:156204968@qq.com。 出版社:人民邮电出版社, 页数:525。

本系列教程目前基于MATLABR2006a,可能对于更高级版本的功能和函数有差异,教程中如有问题,请联系:156204968@qq.com

4.3 结构数组

结构数组的基本组成是结构(Structure),每个结构包含多个域(Fields)。数据只能存储在域中,与元胞数组一样,结构数组也可以存储任何类型的数据,但是从一定意义上讲,结构数组组织数据的能力比元胞数组要强一些。本节讲述结构数组的一些基本操作。

4.3.1 结构数组的创建

结构数组可以通过直接对域进行赋值来创建,也可以通过MATLAB提供的函数struct来创建。下面通过示例来讲解结构数组的创建方法。

【例4.15】结构数组的创建
创建一个结构数组player,该结构数组包含三个域name、nat和att,创建的同时对结构数组的各域进行赋值,具体操作如下:
>> player.name='Bati' %创建域name并赋值
>> player.nat='china' %创建域nat并赋值
>> player.att=[20 17 19 20] %创建域att并赋值
对于简单的单构架的结构数组,即1x1的结构数组,可以直接查看它的具体内容。例如在命令窗口中输入:
>> player
返回结构数组的内容如下:
player =
name: 'Bati'
nat: 'china'
att: [20 17 19 20]
对于单构架的结构数组,可以通过以下方式可以把1x1的结构数组扩展成1x2的结构数组,在输入第二组数据时,MATLAB会返回的是结构数组的信息,而不再是像单结构数组那样返回结构数组的具体内容。例如以下操作:
>> player(2).name='oro' %新建一个player结构体对象,并给相应的域赋值
>> player(2).nat='china'
>> player(2).att=[13 17 19 22]
>> player(2) %查看player结构体的内容
ans =
name: 'oro'
nat: 'china'
att: [13 17 19 22]
此时再输入player将不显示第一组数据,而是显示结构数组的信息。在命令窗口中输入:
>> player
返回结果如下:
player =
1x2 struct array with fields:
name
nat
att
如果要查看结构数组的某一结构的各个域中的具体内容,可以通过下面的方式查看。例如查看player中第一个结构的各域中存储的内容,在命令窗口中输入:
>> player(1)
返回结果如下:
ans =
name: 'Bati'
nat: 'china'
att: [20 17 19 20]
除了上面介绍的直接输入结构数组的各域的值来创建结构数组的方法,还可以使用MATLAB提供的函数struct来创建结构数组。例如创建上面player结构,可以进行如下操作:
>> player(1)=struct('name','Bati','nat','china','att',[20 17 19 20]) %使用struct命令创建结构体变量
>> player(2)=struct('name','oro','nat','china','att',[13 17 19 22])
命令窗口中输入以下内容,查看player中的内容。
>> player(2) %获取结构体变量player中的结构体属性值
返回结果如下:
ans =
name: 'oro'
nat: 'china'
att: [13 17 19 22]

4.3.2 结构数组数据的获取

结构数组可以通过结构数组标识直接获取整个结构数组,或通过域名来获取结构数组中某个域中存储的具体内容,或通过MATLAB提供的函数getfield来获取某个域中存储的具体内容。要获取域中的具体内容,需要预先知道结构数组的各域的名称,为此MATLAB还提供了查询结构数组中各域名的函数fieldnames方便使用。

【例4.16】结构数组数据的获取
>> aaa=struct('name','line','id',rand(4),'cd','5min')
在命令窗口中输入以上内容,创建结构数组aaa如下:
aaa =
name: 'line'
id: [4x4 double]
cd: '5min'
可以直接通过结构数组名获取结构数组。例如利用已知结构数组aaa创建结构数组c1,可以直接输入:
>> c1=aaa
获取结构数组域中的具体内容的最简单的方法是使用符号“.”,例如获取结构数组aaa中id域的具体内容,可以在命令窗口中输入:
>> c2=aaa.id
返回结果如下:
c2 =
0.9501 0.8913 0.8214 0.9218
0.2311 0.7621 0.4447 0.7382
0.6068 0.4565 0.6154 0.1763
0.4860 0.0185 0.7919 0.4057
还可以获取某域中的部分数据,例如在命令窗口中输入:
>> c3=aaa.id(:,1)
返回结果如下:
c3 =
0.9501
0.2311
0.6068
0.4860
上面介绍了使用符号“.”来获取域中的具体内容,此外MATLAB还提供了专用函数getfield获取域中的存储内容。例如在命令窗口输入以下内容:
>> c4=getfield(aaa,'name')
返回结果如下:
c4 =
line
使用函数whos查看工作空间中变量的详细信息。
>> whos
Name Size Bytes Class Attributes
aaa 1x1 516 struct
c1 1x1 516 struct
c2 4x4 128 double
c3 4x1 32 double
c4 1x4 8 char

【例4.17】结构数组域名的获取
首先在MATLAB工作空间创建结构数组:
>> aaa=struct('name','line','id',rand(4),'cd','5min')
aaa =
name: 'line'
id: [4x4 double]
cd: '5min'
在例4.16获取域中存储的具体内容时,必须使用域名来查看,如果在结构数组的域名未知的情况下,将不能通过域名来查看域中的具体内容。为此MATLAB提供了函数fieldnames获取结构数组的所有域,并返回一个元胞数组。例如查看aaa中各域名操作如下:
>> x=fieldnames(aaa)
x =
'name'
'id'
'cd'

4.3.3 结构数组的数据修改

MATLAB提供了修改结构数组中域存储内容的函数setfield。下面通过示例演示该函数的具体使用。

【例4.18】结构数组的数据修改
>> cc=struct('name','ew','math',rand(4),'col','green') %使用struct结构体创建结构数组
首先在命令窗口中输入以上内容,创建结构数组如下:
cc =
name: 'ew'
math: [4x4 double]
col: 'green'
使用函数getfield获取域中的存储内容。在命令窗口中输入以下内容:
>> f1=getfield(cc,'col') %获取结构体数组cc中域col的存储内容
返回结果如下:
f1=
green
然后可以使用函数setfield修改cc中math域的存储内容。具体操作如下:
>> ps=setfield(cc,{1},'col','blue') %修改col域中的存储内容
ps =
name: 'ew'
math: [4x4 double]
col: 'blue'
使用函数getfield获取域中的存储内容,验证是否修改成功。在命令窗口输入以下内容:
>> f2=getfield(ps,'col') %查看是否修改成功
返回结果如下:
f2 =
blue
同样可以对其他域中的存储内容进行修改。
>> pp=setfield(ps,{1},'math',magic(5)) %修改结构体数组ps中域math的存储内容为5阶的魔方阵
>> pp=setfield(ps,{1},'name','sarah') %修改结构体数组ps中域name的存储内容为sarah

4.4 本章小结

本章重点介绍了MATLAB提供的3种重要的数据类型的创建及相关操作,这3种数据类型分别是:字符数组、元胞数组和结构数组。理解和掌握这3种数据类型是进一步学习MATLAB的基础。

字符数组部分使用大量的实例重点介绍了简单和复杂字符数组的创建方法、字符数组的比较操作、字符串的查找和替换操作以及字符数组与其他数据类型之间的相互转化操作等内容。大量的实例使得读者可以轻松的掌握字符数组的相关操作。

元胞数组部分首先介绍了元胞数组中元胞和元胞中所包含的内容为两个不同的范畴,并且对应的是两种截然不同的操作,分别为元胞外标识和元胞内编址。在此基础上通过实例介绍了元胞数组的多种创建方法、元胞数组内容的访问以及元胞数组内容的显示等内容。

结构数组部分首先介绍了结构数组的定义,然后通过实例重点介绍了结构数组的创建以及对元胞数组中元素进行访问和修改等操作相关的内容。与元胞数组一样,结构数组也可以存储任何类型的数据,但是从一定意义上讲,结构数组组织数据的能力比元胞数组要强一些。

作者:德特数据
联系方式:156204968@qq.com

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 同事娟子家境很好,有房有车。她本身属于小巧玲珑的类型,一米五五的身高,四十四公斤的体重,瓜子脸,大...
    晓红红阅读 179评论 0 2
  • 前几天真的是太忙了,各种表格填写,各种通知,还要准备参加诚信辩论会。每天一点多才睡觉,因此没怎么做总结。。。 1....
    千与千宝阅读 175评论 0 0
  • 1、文章开始前,先分享一下最近生活中的某个片段。 我今年三十,已经在一个名不见经传的小城的某个偏僻又闭塞的小镇里呆...
    绿月乔木阅读 998评论 4 3
  • 文/公羽 生活中,女人的忍耐,有时候被美称为一种隐忍的坚强,甚至是美德。若是当一种隐忍血写了一段段的悲剧,你还会高...
    胖东阅读 383评论 0 2