Matlab学习心得系列——005. 结构数组由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“matlab的学习心得”。
005.结构数组
编程语言要描述日常生活中的某一类事物,就是要赋予这类事物一个公共名称(类名),再把这类事物具有的各种属性分别存放为若干变量(数据元素),这就是“结构体”。结构体里再加上若干操作其数据元素的函数(成员函数),就是“类”。然后,“类”就可以作为新的数据类型定义对象(类的实例化),再操作这些对象,实现编程需要。
以上就是面向对象的编程思想(适合C++或Java)。
例如,描述学生,就用一个学生类Student;学生属性:学号、姓名、专业;实现操作:学生转专业。(粗略C++代码)
claStudent { private:// 数据元素一般设为该类的私有数据,防止属性被随意修改 int number;string name;
// string定义字符串 stringmajor;public: // 成员函数一般设为可公共访问
Student(intnum, string n, string m);// 类构造函数用于生成具体对象,必须与类名相同 voidChangeMajor(String newmajor);} Student::Student(intnum, string n, string m){ number = num;name = n;major = m;} void Student::ChangeMajor(String newmajor)// Student::表示函数是来自Student类 { major = newmajor;} // 下面是使用Student类:
Student s1;
// 用Student类定义一个“学生”对象s1 s1.ChangeMajor(“Math”);//把学生s1的专业修改为“Math”
可见,借助结构体或类的编程,既能与现实世界中的事物建立自然的对应(符合思维习惯),又能实现模型化的“批量生产”(用“类”可以整体性地、一遍一遍地建立对象、操作对象)。这也是结构体或类(面向对象编程)的优势所在。__________________________ 回到Matlab,元胞数组只是呆板的堆放数据的仓库,结构数组则具有了与实际对象所对应的结构属性,这等同于“C语言的结构体”、“C++或Java的类的数据成员部分”。
结构数组是由若干个结构(struct)组成,每个结构都包含多个结构域(fields);数据必须存放在结构域中,可以是任何类型、任意大小的数据。例如,多个图形对象构成一个结构数组,每个图形对象就是一个结构,图形对象的一个属性对应一个结构域。
即,结构数组(矩阵)的元素是结构,每个结构包含若干结构域。
一、结构数组的创建 1.用直接赋值语句创建
例1 创建学生的结构数组,每个结构包含学号、姓名两个结构域(属性)
student(1).number = '001';% 直接对结构数组第1个结构s(1)的结构域number赋值
student(1).name = '张三';student(1).number = '002';student(2).name = '李四';student
运行结果:student = 1x2 struct array with fields: number name 注意:上面是一维结构数组,也可以是二维或更多维的,例如,student(1,2).name = '……';
2.用struct函数创建
语法:s = struct(‘field1’, values1, ‘field2’, values2, …)student(1)= struct('number', '001','name', '张三');student(2)= struct('number', '002','name', '李四');student
运行结果同上。
二、结构数组的操作
1.访问结构数组中的结构域
(1)通过结构域访问操作符“.”例如,student(2).name返回学生二的姓名:李四
(2)利用deal()函数
[name1, name2] = deal(student(:).name)
返回name1 =张三name2 =李四 “:”表示所有结构域
(3)利用getfield()函数获取指定结构域的值,对于前面的结构数组student,大小是1×2 getfield(student,{1,2},'name')% 返回结构数组student第1行第2列的结构的结构域为name的值,% 相当于student(1,2).name
运行结果:ans= 李四
2.其他操作
(1)设置或修改结构域的值——setfield()
student = setfield(student,{1,2},'name', ‘王五’);——修改student(1,2).name的值为‘王五’
注意:必须把setfield()返回值赋给原结构数组,修改才会生效。
(2)删除结构数组的指定结构域——rmfield()
s.field1 = [1,2,3];s.field2 = 'string';s.field3 = {1 2 3;4 5 6};s s =rmfield(s,{'field2','field3'})s = rmfield(s,'field1')
运行结果:s =
field1: [1 2 3]
field2: 'string' field3: {2x3 cell}
s =
field1: [1 2 3]
s =1x1 struct array with no fields.注意:必须把rmfield()返回值赋给原结构数组,删除才会生效。
(3)判断函数
isfield(s, ‘fieldname’)——判断s中是否含有名为fieldname的结构域; itruct(s)——判断s是否是结构数组
3.结构数组与元胞数组的相互转换
(1)结构数组转元胞数组——struct2cell()
s.field1 = [1,2,3];s.field2 = 'string';s.field3 = {1 2 3;4 5 6};s c = struct2cell(s)运行结果:s =
field1: [1 2 3] field2: 'string' field3: {2x3 cell} c =
[1x3 double] 'string'
{2x3 cell }(2)元胞数组转结构数组
s = cell2struct(c, fields, dim)
c = {‘001’, ‘张三’, 175, 65;‘002’, ‘李四’, 178, 70}
fields = {'Num','Name','Height','Weight'};% 临时变量,存放全部的结构域名
s = cell2struct(c,fields,2)% dim=2表示将c按行转为结构数组(即每行是一个结构)% dim=1表示将c按列转为机构数组(即每列是一个结构)
s(1)
运行结果:c =
'001'
'张三'
[175]
[65] '002'
'李四'
[178]
s =2x1 struct array with fields: Num Name Height Weight ans=Num: '001' Name: '张三' Height: 175 Weight: 65
下次内容:字符串。