MATLAB从基础到精通
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.6 结构体

结构体数据类型可以把不同数据类型的变量放到同一个变量名下,通过不同“域”的概念对结构体中的不同数据进行赋值、操作。结构体中的数据存储在相应的“域”中。

2.6.1 结构体的生成

结构体类型数据生成的方法主要有命令行直接赋值法和函数法。命令行直接赋值法是指直接把不同类型的数据赋值给结构体变量不同的域中;函数法是指通过MATLAB中自带的函数struct()创建结构体变量。下面分别通过这两种方法来创建结构体类型的变量。

1.命令行直接赋值法

通过命令行直接赋值即直接给结构体中的不同域赋值,结构与域之间用点号“.”连接,不同域中可保存不同数据类型的变量。下面以实例演示通过命令行直接创建结构体变量。

【例2.22】命令行直接赋值法生成结构体。

>> ss.str='ABC';
>> ss.num=[5:2:16];
>> ss.str2=['A','S' ,'BS'];
>> ss
ss =
    str: 'ABC'
    num: [5 7 9 11 13 15]
    str2: 'ASBS'
2.函数法

MATLAB中提供了struct()函数创建结构体,具体用法如下。

s = struct('field1', values1, 'field2', values2, ...)

其中,“'field1'”和“'field2'”为域名,“values1”和“values2”为域中的值。

【例2.23】函数法生成结构体。

>> ss=struct('str','ABC','num',[5:2:16],'str2',['A','S' ,'BS'])
ss =
    str: 'ABC'
    num: [5 7 9 11 13 15]
    str2: 'ASBS'

2.6.2 结构体的操作

结构体的常用操作包括对结构体元素的访问、结构体的显示、结构体的删除。下面将具体叙述结构体的常用操作。

1.访问结构体中的元素

【例2.24】访问结构体中的元素。

>> ss=struct('stu_name',{'wang','ma','li'},'stu_num',
{100,101,102},'stu_age',{22,24,22})
ss =
1x3 struct array with fields:
    stu_name
    stu_num
    stu_age
>> ss(:,1)  %访问结构体ss中的第一列元素
ans =
    stu_name: 'wang'
    stu_num: 100
    stu_age: 22
>> ss.stu_name %访问结构体ss中的域stu_name
ans =
wang
ans =
ma
ans =
li
>> ss(1).stu_name %访问结构体ss中第1列的域stu_name
ans =
wang
2.结构体的显示

MATLAB中提供了fieldnames()函数显示结构体的域名,而getfield()函数可用于显示结构体各域中的具体内容。这两个函数的具体用法如下。

● names = fieldnames(s):返回结构体s中的各域名到变量names。

● f = getfield(s,'field'):显示结构体s中域field的具体内容,返回到变量f中,s必须为1×1的结构体。

【例2.25】结构体的显示。

>> ss=struct('stu_name',{'wang','ma','li'},'stu_num',
{100,101,102},'stu_age',{22,24,22});
>> names = fieldnames(ss) % fieldnames()函数显示结构体ss中的域名
names =
    'stu_name'
    'stu_num'
    'stu_age'
>> ss2=struct('str','ABC','num',[5:2:16],'str2',['A','S' ,'BS']);
>> whos ss ss2   %结构体ss、ss2的大小
  Name   Size          Bytes Class
  ss    1x3            796 struct array
  ss2    1x1            434 struct array
Grand total is 39 elements using 1230 bytes
>> f = getfield(ss,'stu_name') %结构体ss大小1×3不可用函数getfield显示域中的内容
??? Illegal right hand side in assignment.Too many elements.
Error in ==> getfield at 38
    f = s.(deblank(strField)); % deblank field name
>> f = getfield(ss2,'str') % ss2大小1×1可用函数getfield显示域中的内容
f =
ABC
3.结构体的删除

结构体的删除使用函数rmfield,其具体用法如下。

● s = rmfield(ss,'field'):用于删除结构体中的域“field”。

● s = rmfield(ss,FIELDS):用于同时删除结构体中的多个域,FIELDS为需要删除的多个域的域名的字符串。

【例2.26】结构体的删除。

>> ss=struct('stu_name',{'wang','ma','li'},'stu_num',{100,101,102},
'stu_age',{22,24,22});
>> s = rmfield(ss,'stu_name')
s =
1x3 struct array with fields:
    stu_num
    stu_age
>> s2 = rmfield(ss,{'stu_name','stu_age'})
s2 =
1x3 struct array with fields:
    stu_num