《Matlab学习心得系列》由会员分享,可在线阅读,更多相关《Matlab学习心得系列(7页珍藏版)》请在金锄头文库上搜索。
1、编程语言要描述日常生活中的某一类事物,就是要赋予这类事物 一个公共名称(类名),再把这类事物具有的各种属性分别存放为若 干变量(数据元素),这就是“结构体”。结构体里再加上若干操作其 数据元素的函数(成员函数),就是“类”。然后,“类”就可以作为 新的数据类型定义对象(类的实例化),再操作这些对象,实现编程 需要。以上就是面向对象的编程思想(适合C+或Java)。例如,描述学生,就用一个学生类Student;学生属性:学号、 姓名、专业;实现操作:学生转专业。(粗略C+代码)class Studentprivate:/数据元素一般设为该类的私有数据,防止属性被随意修改int number;st
2、ring name;/ string 定义字符串string major;public:/成员函数一般设为可公共访问Student(int num, string n, string m); /类构造函数用于生成具体对象,必须与类名 相同void ChangeMajor(String newmajor);Student: Student(int num, string n, string m)number = num;name = n;major = m;void Student: ChangeMajor(String newmajor) / Student:表示函数是来自 Student 类
3、 major = newmajor;/下面是使用Student类:Student s1;/用Student类定义一个“学生”对象s1s1. ChangeMajor(Math); / 把学生 s1 的专业修改为 “Math”可见,借助结构体或类的编程,既能与现实世界中的事物建立自 然的对应(符合思维习惯),又能实现模型化的“批量生产”(用“类” 可以整体性地、一遍一遍地建立对象、操作对象)。这也是结构体或 类(面向对象编程)的优势所在。回到Matlab,元胞数组只是呆板的堆放数据的仓库,结构数组则 具有了与实际对象所对应的结构属性,这等同于“C语言的结构体”、 “C+或Java的类的数据成员部分
4、”。结构数组是由若干个结构(struct)组成,每个结构都包含多个 结构域(fields);数据必须存放在结构域中,可以是任何类型、任意 大小的数据。例如,多个图形对象构成一个结构数组,每个图形对象 就是一个结构,图形对象的一个属性对应一个结构域。艮L结构数组(矩阵)的元素是结构,每个结构包含若干结构域。一、结构数组的创建1. 用直接赋值语句创建例1创建学生的结构数组,每个结构包含学号、姓名两个结构域(属性)student(1).number = 001;%直接对结构数组第1个结构s(1)的结构域number赋值student(1).name = 张三;student(1).number =
5、002;student(2).name =李四; student运行结果:student =1x2 struct array with fields:numbername注意:上面是一维结构数组,也可以是二维或更多维的,例如,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运行结果同上。二、结构数组的操
6、作1.访问结构数组中的结构域(1) 通过结构域访问操作符“.”例如,student(2).name返回学生二的姓名:李四(2) 利用deal()函数namel, name2 = deal(student(:).name)返回namel = 张三 name2 = 李四“:”表示所有结构域(3) 利用getfield()函数获取指定结构域的值,对于前面的结构数组student,大小是1X2getfield(student,1,2,name)%返回结构数组student第1行第2列的结构的结构域为name的值,% 相当于 student(1,2)name运行结果:ans = 李四2. 其他操作(1)
7、设置或修改结构域的值一一setfield()student = setfield(student,1,2,name, 王五);修改student(1,2).name的值为王五注意:必须把setfield()返回值赋给原结构数组,修改才会生效。(2)删除结构数组的指定结构域rmfield()s.fieldl = 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 = fieldl: 1 2 3field2: stringfield3:
8、 2x3 cells = field1: 1 2 3s =1x1 struct array with no fields.注意:必须把rmfield()返回值赋给原结构数组,删除才会生效。(3) 判断函数isfield(s, fieldname)判断s中是否含有名为fieldname的结构域;isstruct(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 =
9、 fieldl: 1 2 3field2: stringfield3: 2x3 cellc =1x3 doublestring2x3 cell (2)元胞数组转结构数组s = cell2struct(c, fields, dim)c = 001, 张三,175, 65; 002, 李四,178, 70fields = Num,Name,Height,Weight;%临时变量,存放全部的结构域名s = cell2struct(c,fields,2)% dim=2表示将c按行转为结构数组(即每行是一个结构)% dim=1表示将c按列转为机构数组(即每列是一个结构) s(1)运行结果:c =001张三17565002李四17870s =2x1 struct array with fields:NumNameHeightWeightans = Num: 001Name:张三Height: 175Weight: 65下次内容:字符串。