4.3  Structure数组域的基本操作

MATLAB提供了部分函数用于结构数组域的操作,在表3-6中对这些函数进行了总结。

表3-6  结构数组操作函数

函    数

说    明

函    数

说    明

创建结构数组或将其他数据类型转换为结构数组

删除结构的指定域

获取结构的域名

判断给定的字符串是否为结构的域名

获取结构的域内容

判断给定的数据对象是否为结构类型

设置结构的域内容

orderfields

对结构域排序

【例3-17】  结构操作函数使用示例。

>> USPres.name = 'Franklin D. Roosevelt';

>> USPres.vp(1) = {'John Garner'};

>> USPres.vp(2) = {'Henry Wallace'};

>> USPres.vp(3) = {'Harry S Truman'};

>> USPres.term = [1933, 1945];

>> USPres.party = 'Democratic';         %  创建包括4个域名的结构数组

>> presFields = fieldnames(USPres)      %  使用fieldnames函数获取现有域名

presFields =

>> orderfields(USPres)       %  使用orderfields函数对域名按照字母顺序进行排序

name: 'Franklin D. Roosevelt'

party: 'Democratic'

term: [1933 1945]

vp: {'John Garner'  'Henry Wallace'  'Harry S Truman'}

>> mystr1 = getfield(USPres, 'name')      %  获取结构的域内容

Franklin D. Roosevelt

>> mystr2= setfield(USPres, 'name', 'ted')    %  设置结构的域内容

name: 'ted'

vp: {'John Garner'  'Henry Wallace'  'Harry S Truman'}

term: [1933 1945]

party: 'Democratic'

4.4  Structure数组的操作

本小节对结构数组的操作进行深入的介绍。

1.结构数组的扩充和收缩

【例3-18】  结构数组的扩充与收缩示例。

(1)单结构的创建

>> USPres.name = 'Franklin D. Roosevelt';

>> USPres.vp(1) = {'John Garner'};

>> USPres.vp(2) = {'Henry Wallace'};

>> USPres.vp(3) = {'Harry S Truman'};

>> USPres.term = [1933, 1945];

>> USPres.party = 'Democratic';         %  创建包括4个域名的结构数组

(2)结构数组的扩展

>> USPres(3,2).name='Richard P. Jackson'%  结构数组的扩展

3x2 struct array with fields:

(3)结构数组的收缩

>> USPres(2,:)=[]       %  通过对结构数组赋值为空矩阵来实现删除

2x2 struct array with fields:

2.增添域或删除域

增加结构数组域常用的方法就是对其直接赋值,如3.4.1小节中介绍的那样。至于域的删除,则必须使用rmfield函数才能够实现。

【例3-19】  对结构数组进行域的增添和删减操作。

(1)创建结构数组

>> clear,for k=1:10;department(k).number=['No.',int2str(k)];end

>> department

department =

1x10 struct array with fields:

(2)在数组中任何一个结构上进行的域增添操作都将影响到整个结构数组。

>> department(1).teacher=40;

>> department(1).student=300;

>> department(1).PC_computer=40;

>> department

department =

1x10 struct array with fields:

PC_computer

>> department(2)

number: 'No.2'

teacher: []

student: []

PC_computer: []

(3)增添子域的操作只影响被操作的那个具体结构,而不影响整个结构数组。

>> department(2).teacher.male=35;     %  增添子域

>> department(2).teacher.female=13;    %  增添子域

>> D2T=department(2).teacher         %  第2 结构teacher 域包含两个子域

>> D1T=department(1).teacher    %  第1 结构teacher 域仅是一个数

(4)删除子域的操作也只影响被操作的那个具体结构。

>> department(2).teacher=rmfield(department(2).teacher,'male');

>> department(2).teacher

(5)删除域的操作是对整个结构数组进行的。

>> department=rmfield(department,'student')

department =

1x10 struct array with fields:

PC_computer

>> department=rmfield(department,{'teacher';'PC_computer'})

department =

1x10 struct array with fields:

3.数值运算操作和函数对结构数组的应用

如果结构数组域中的内容是数值型的一般矩阵,那么适用于一般矩阵的数值操作和函数也可以应用于结构数组。

【例3-20】  数值运算操作和函数对结构数组的应用示例。

>> A.a=magic(3)        %  创建数值型的结构数组

a: [3x3 double]

>> A.a

8     1     6

3     5     7

4     9     2

>> A.a.^2             %  运算符操作

64     1    36

9    25    49

16    81     4

>> sqrt(A.a)            %  函数操作