4 Structure数组 Structure数组也称结构数组,另外还有些书籍称作架构数组。结构是MATLAB提供的一种将选择的数据存储到一个实体的数据类型。一个结构可以由数据容器组成,这种容器叫做域,每个域中可以存储MATLAB支持的数据类型。用户可通过使用存储数据时指定的域名来对域中的数据进行访问。图3-1是一个包括了a、b和c等3个域的结构数组S的示意图。 结构中的每一个域都存储一个独立的MATLAB数组,这个数组可以属于任何一个MATLAB或者用户自定义的数据类型,而且可以具有任何合法的数组尺寸。结构中的一个域可以存储和另外一个域完全不同类型的数据,而且数据的尺寸也可以完全不同。例如图3-1所示的结构s的第1个域a中存储了1´6 double类型的数组,第2个域b中存储了1´5字符串类型的数组,第3个域c中存储了3´3 double类型的数组。 和MATLAB其他的数据类型相同,结构类型也是一个数组。在MATLAB中,结构类型称为struct,若干个结构组成的数组可以称为结构数组。和其他的MATLAB数据类型相同,结构数组可以具有任何尺寸。如图3-2所示,一个结构数组s由两个元素构成:s(1)和s(2),每个元素都具有域a、b和c的结构。
图3-1 结构示意图 图3-2 结构数组示意图 结构数组具有很多优点,使用结构数组的理由如下。 (1)一般情况下使用结构数组(或者下面提到的元胞数组)的原因是在实际中需要存储多种混合的数据类型和尺寸。因为一般的MATLAB数组只能存储同样尺寸的同种数据类型的元素。结构数组和元胞数组就是重要的混合数据类型存储手段。 (2)一个结构还提供了在一个实体中存储特定数据的方法,这可以令用户对数据进行整体或者部分访问与操作。同时用户可以将函数直接运用于结构,在用户自定义的M文件函数之间进行数据传递,显示结构任何域中的值,或者进行支持结构类型的任何MATLAB操作。 (3)用户可以给数据以文字标签,这样在应用中可以清楚地对数据所包含的信息进行标注。 4.1 Structure数组的创建 结构数组的创建可以使用两种方法,一种是直接赋值的方法,另外一种是利用struct函数创建。 1.使用直接赋值法创建结构数组 每一个结构数组可以包含若干个域,而每个域又可以是不同类型的数据。所谓直接赋值法创建结构数组,就是采用直接定义结构数组的域,并将相应的数据值赋给该元素。 【例3-13】 直接赋值法创建结构数组示例,以结构数组保存员工资料数据。 >> employee.name='henry'; >> employee.sex='male'; >> employee.age=25; >> employee.number=12345; >> employee employee = name:'henry' sex:'male' age:25 number: 12345employee即是以结构类型存储的数据。结构还可以通过赋值的方式扩展为结构数组。例如在本例中添加员工lee的基本数据可以使用如下命令: >> employee(2).name='lee'; >> employee(2).sex='female'; >> employee(2).age=23; >> employee(2).number=98765; >> employee(2) ans = name:'lee' sex:'female' age:23 number:98765 >> employee % 查看employee结构数组 employee = 1x2 struct array with fields: name sex age number 可以看出,在添加元素之后,employee成为了“1x2 struct”。 【例3-14】 直接赋值法创建含子域结构数组示例。 在结构数组的使用过程中,一个结构的域可以进一步存储子域,操作的方法和域相同,只需名称书写过程中用'.'符号加上子域名即可。 >> green_house.name='一号房'; >> green_house.volume='2000 立方米'; >> green_house.parameter.temperature=... [31.2 30.4 31.6 28.7;29.7 31.1 30.9 29.6]; %子域温度 >> green_house.parameter.humidity=... [62.1 59.5 57.7 61.5;62.0 61.9 59.2 57.5]; %子域湿度 green_house = name: '一号房' volume: '2000 立方米' parameter: [1x1 struct] 本例中域parameter所存储的就是一个结构,在parameter中包括子域。 >> green_house.parameter % 显示域的内容 ans = temperature: [2x4 double] humidity: [2x4 double] >> green_house.parameter.temperature % 显示子域中的内容 ans = 31.2000 30.4000 31.6000 28.7000 29.7000 31.1000 30.9000 29.6000 2.使用struct函数创建结构数组 除了直接赋值之外,用户还可以使用struct函数创建结构数组。struct函数可以根据指定的域及其相应的值创建结构体数组。此函数的—般形式为: str_array=struct(‘filed1’,{val1},’filed2’,{val2}…) str_array=struct(‘filed1’,val1,’filed2’,val2…) 其中'filed1'为域名,val1为该域的值,可能是一个标量或元胞数组,而使用的元胞数组必须具有相同的尺寸。 【例3-15】 使用struct函数创建结构数组示例1。 >>student=struct('name','henry','age',25,'grade',uint16(1)) % 创建结构数组 student = name:'henry' age:25 grade: 1 >> whos Name Size Bytes Class Attributes student 1x1 548 struct >>student=struct('name',{'richard','jackson'},... 'age',{23,24},'grade',{2,3}) %创建结构数组 student = 1x2 struct array with fields: name age grade >> whos Name Size Bytes Class Attributes student 1x2 924 struct >>student=struct('name',{},'age',{},'grade',{}) student = 0x0 struct array with fields: name age grade >> whos Name Size Bytes Class Attributes student 0x0 192 struct 【例3-16】 使用struct函数创建结构数组示例2。 >> s = struct('a', {{1 4 7 2 9 3}, 'Anne'},... 'b', {'James', pi}, ... 'c', {magic(3), (1:7)'}); % 使用struct函数创建结构数组 >> s(1) ans = a:{[1] [4] [7] [2] [9] [3]} b:'James' c: [3x3double] >> s(2) ans = a:'Anne' b:3.1416 c: [7x1double] 另外需要注意的是:在MATLAB中,符号'{}'是用来表示元胞数组的(这点将在下一节介绍),而在结构数组的赋值过程中,符号'{}'则被用来进行参数传递,如果要将元胞数组赋值给结构数组,则应使用符号'{{}}'。 4.2 Structure数组的寻访 本小节介绍如何通过使用域名和下标对结构数组进行寻访。 1.一般结构和域下标 最一般的对结构数组进行存储和寻访的方法是: structName(sRows, sCols, ...).fieldName(fRows,fCols, ...) 即在结构数组名后面通过下标对数组中的某一个结构进行寻访,然后通过使用小数点'.'+域名对域进行寻访。 如果结构是一个标量,则可省略结构名中的下标: structName.fieldName(fRows, fCols, ...) 2.多层结构数组的寻访 在实际应用中,经常需要在一个域中设置多个子域,甚至进行多层的嵌套,这些子域中可以存储MATLAB支持的数组类型。表3-5列出了寻访多层结构数组的语法。 表3-5 多层结构数组的寻访
3.结构数组寻访技巧 在结构数组的寻访过程中,使用以下技巧有一定的帮助作用。 使用whos函数来查看正在处理的数据的类型和尺寸。结合这些信息,用户可以更准确地对需要的数据进行寻访。 仅输入表达式中等号右边的部分,充分利用默认结果变量名ans。这样通过不指定输出结果的数据类型,可以尽量避免指定结果类型所造成的错误,用户可以使用输出结果中MATLAB软件决定的数据类型,这样在输出结果中可以看出需要采用哪种方式来对数据进行寻访。 另外用户还可以分步对多层结构数组进行寻访,而不是一次性寻访。例如可以将表达式S(5,3).A(4,7).B(:,4)分解成以下形式: >> x = S(5,3).A; % x是一个结构数组 >> y = x(4,7).B; % y 也是一个结构数组 >> z = y(:,4) % z 是一个一般数组
|
|