MATLAB的Structure数组

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 多层结构数组的寻访

元素类型寻访语法元素类型寻访语法

结构数组S

域A中为一般数组

S(3,15).A(5,25)结构数组S

域A中为元胞数组

子域B中为一般数组

S(3,15).A{5,20}.B(50,5)

结构数组S

域A中为元胞数组

S(3,15).A{5,20}结构数组S

域A中为一般结构

子域B中为元胞数组

S(3,15).A.B{5,20}

结构数组S

域A中为一般数组

子域B中为一般数组

S(3,15).A(5,20).B(50,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 是一个一般数组

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

推荐阅读更多精彩内容