(完整版)Matlab学习心得系列——005.结构数组

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档