(完整版)Matlab学习心得系列——005.结构数组
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
005. 结构数组
编程语言要描述日常生活中的某一类事物,就是要赋予这类事物一个公共名称(类名),再把这类事物具有的各种属性分别存放为若干变量(数据元素),这就是“结构体”。结构体里再加上若干操作其数据元素的函数(成员函数),就是“类”。然后,“类”就可以作为新的数据类型定义对象(类的实例化),再操作这些对象,实现编程需要。
以上就是面向对象的编程思想(适合C++或Java。
例如,描述学生,就用一个学生类Stude nt;学生属性:学号、
姓名、专业;实现操作:学生转专业。(粗略C++代码)
class Student
{ private:
// 数据元素一般设为该类的私有数据,防止属性被随意修改
int number;
string name; string major; public:// string 定义字符串
// 成员函数一般设为可公共访问
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 类
{
major = newmajor;
}
// 下面是使用Student 类:
Student s1; // 用Student 类定义一个“学生”对象s1
s1. ChangeMajor(“ Math ”// );把学生s1 的专业修改为“ Math ”
可见,借助结构体或类的编程,既能与现实世界中的事物建立自然的对应(符合思维习惯),又能实现模型化的“批量生产”(用“类” 可以整体性地、一遍一遍地建立对象、操作对象)。这也是结构体或类(面向对象编程)的优势所在。
回到Matlab ,元胞数组只是呆板的堆放数据的仓库,结构数组则具有了与实际对象所对应的结构属性,这等同于“ C 语言的结构体”、“C++或Java的类的数据成员部分”。
结构数组是由若干个结构(struct )组成,每个结构都包含多个结构域(fields);数据必须存放在结构域中,可以是任何类型、任意大小的数据。例如,多个图形对象构成一个结构数组,每个图形对象就是一个结构,图形对象的一个属性对应一个结构域。
即,结构数组(矩阵)的元素是结构,每个结构包含若干结构域。
结构数组的创建
1. 用直接赋值语句创建
例1创建学生的结构数组,每个结构包含学号、姓名两个结构域(属性) stude nt(1). nu mber = '001';
%直接对结构数组第1个结构s(1)的结构域number赋值stude nt(1). name =' 张三';
stude nt(1). nu mber = '002';
stude nt(2). name =' 李四';
stude nt
运行结果:stude nt = 1x2 struct array with fields:
nu mber
n ame
注意:上面是一维结构数组,也可以是二维或更多维的,例如, student(1,2).name =' .............. ';
运行结果同上
二、结构数组的操作
1.访问结构数组中的结构域
(1)通过结构域访问操作符“ •”例如,
stude nt(2). name返回学生二的姓名:李四
(2)利用deal( )函数
[n amel, n ame2] = deal(stude nt(:). name)
返回namel = 张三name2 = 李四
“:”表示所有结构域
(3)利用getfield()函数获取指定结构域的值,
对于前面的结构数组student,大小是1 x 2
getfield(stude nt,{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.fieldl = [1,2,3];
s.field2 = 'stri ng';
s.field3 = {1 2 3; 4 5 6}; s
s = rmfield(s,{'field2','field3'}) s = rmfield(s,'field1')
运行结果:s =field1: [1 2 3]
field2: 'stri ng'
field3: {2x3 cell}
s =field1: [1 2 3]
s =1x1 struct array with no fields.
注意:必须把rmfield()返回值赋给原结构数组,删除才会生效。
(3)判断函数
isfield(s,‘ field name ')
--- 判断s中是否含有名为field name的结构域;
isstruct(s)
――判断s是否是结构数组
3. 结构数组与元胞数组的相互转换
(1)结构数组转元胞数组------ s truct2cell()
s.field1 = [1,2,3];
s.field2 = 'stri ng';
s.field3 = {1 2 3; 4 5 6}; s
c = struct2cell(s)