
4 Structure数组
因为如果没有范型, 那么容器里面存的数据是object类, 这跟它的实现有关, 容器里面存放的数据是可变, 但底层其实把类型都转化为了同一个类型object类型,这样再用数组进行实现,这就可以作为容器使用了,可是这样面临着,类型都是object的麻烦。确实这样也能实现多种数据的存储,但是有一个很严重的缺陷,当我们用object来接数据的时候,一旦数据存储到容器中,容器就会忘记存储的数据类型,因为只知道当前对象是object类型,我们使用起来的代码就会变成这样。在c和c++中常用的基本类型数组,在objc中对应的是nsarray类,这个类中存储的数据结构体数组,也必须是类,而不能是基本数据类型,所以要将基本数据类型转换成对象存储,例如。
结构中的每一个域都存储一个独立的MATLAB数组,这个数组可以属于任何一个MATLAB或者用户自定义的数据类型,而且可以具有任何合法的数组尺寸。结构中的一个域可以存储和另外一个域完全不同类型的数据结构体数组,而且数据的尺寸也可以完全不同。例如图3-1所示的结构s的第1个域a中存储了16 double类型的数组,第2个域b中存储了15字符串类型的数组,第3个域c中存储了33 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]

[0011]优选地,在采用osd参数将osd显示内容叠加至视频图像之前,还包括:处理器根据视频图像的分辨率调整osd显示内容中初始字体的大小。4.根据权利要求1所述的方法,其特征在于,在采用所述osd参数将所述osd显示内容叠加至所述视频图像之前,还包括: 所述处理器根据所述视频图像的分辨率调整所述osd显示内容中初始字体的大小。3、电脑上的字幕怎么制作,先在记事本里输入这样的格式内容[00:06.00]作文网络家教qq1476384638 中括号里是在视频中显示的时间,后面是显示内容,因为视频比较长,所以这样的显示内容要做很多行的。
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。
public student(string name,uint age uint id):base(name,age)。printf("%d%20s%20s%20s",student[i].num,student[i].name,student[i].major,student[i].grade)。package mainimport "fmt"type human struct{ name string age int weight int}type student struct{ human //@1 speciality string}func main(){ mark := student{human{"mark", 25, 120}, "e-commerce"} fmt.println(mark.name, mark.age, mark.weight, mark.speciality)//@2}。
student =
name:'henry'
age:25
grade: 1
>> whos
NameSizeBytes Class Attributes
student1x1548 struct
>>student=struct('name',{'richard','jackson'},...
'age',{23,24},'grade',{2,3})%创建结构数组
student =
1x2 struct array with fields:
name
age
grade
>> whos
NameSizeBytes Class Attributes
student1x2924 struct
>>student=struct('name',{},'age',{},'grade',{})
student =
0x0 struct array with fields:

name
age
grade
>> whos
NameSizeBytes Class Attributes
student0x0192 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函数来查看正在处理的数据的类型和尺寸。结合这些信息,用户可以更准确地对需要的数据进行寻访。
变量和标识符 333.3简单数据类型与表示范围 353.3.1整型数据 363.3.2实型数据 423.3.3字符型数据和字符串常量 443.3.4简单数据类型的表示范围 473.3.5数据的简单输出 493.4c语言的运算符与表达式 513.4.1赋值运算符。表达式及输入与输出2.1c语言的发展与特点2.2c程序概述2.2.1c语言程序的基本结构2.2.2c语言的字符集2.2.3c语言的词汇2.2.4c语言的书写规则2.3c程序的上机过程2.4常量和变量2.4.1常量2.4.2变量2.5数据类型2.5.1整型数据2.5.2实型数据2.5.3字符型数据2.5.4各类数值型数据之间的混合运算2.6运算符与表达式2.6.1算术运算符和算术表达式2.6.2关系运算符和关系表达式2.6.3逻辑运算符和逻辑表达式2.6.4赋值运算符和赋值表达式2.6.5逗号运算符和逗号表达式2.7输入与输出简介2.7.1数据输入与输出的概念2.7.2字符数据的输入与输出2.7.3格式的输入与输出2.8本章小结习题2第3章顺序和选择结构程序设计3.1顺序结构编程3.1.1c语句3.1.2顺序结构程序设计3.2选择结构程序设计。运算符与表达式253.1c语言的数据类型253.2常量与变量253.2.1变量253.2.2常量283.3整型数据293.3.1整型常量与变量293.3.2整型数据的输入和输出303.3.3整型数据在内存中的存储方式★363.4实型数据373.4.1实型常量与变量373.4.2实型数据的输入和输出383.4.3实型数据在内存中的存储方式★393.5字符型数据413.5.1字符型常量。
另外用户还可以分步对多层结构数组进行寻访,而不是一次性寻访。例如可以将表达式S(5,3).A(4,7).B(:,4)分解成以下形式:
>> x = S(5,3).A;% x是一个结构数组
>> y = x(4,7).B;% y 也是一个结构数组
>> z = y(:,4)% z 是一个一般数组
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-112186-1.html
你不知道
额
肯定不会让我们失望的
因为现代战争将没有胜利者