本系列教程来源于出版设计《基于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