Matlab中的结构体(struct)
结构体数组是使用名为字段的数据容器将相关数据组合在一起的数据类型, 是一个存储{键: 值}的数据结构 。每个字段都可以包含任意类型的数据。 Matlab中的结构体类似于Python中的“字典”。
结构体的理解:可以把结构体想象成数组的加强版,只不过这个“数组”内部的结构更加灵活,其内部分成不同的“部门”(既"field"),每个部门存储一类特定的有意义的数据,每个“部门”(既"field")内部可以认为又是低层次的一个数组。
1.结构体的创建:
可以使用 structName.fieldName 格式的圆点表示法来访问字段中的数据。
(1)使用直接赋值方法创建结构体
例1:
%这里,student就是这个结构体的变量名(类似于数组的名字)。
% .name .id之类的是student这个变量的下一级的field名。
%既然student是变量名,那么和数组类似,可以有多个具体的元素(实体),
那么各个元素的索引方式也和数组索引类似,采用student(1),student(2)之类。
student.name = 'John Doe'; %相当于对student(1)的各个field内容进行初始化
student.id = 'jdo2@sfu.ca';
student.number = 301073268;
student.grade = [100, 75, 73; ...
95, 91, 85.5; ...
100, 98, 72];
disp(student)
student =
包含以下字段的 struct:
name: 'John Doe'
id: 'jdo2@sfu.ca'
number: 301073268
grade: [3×3 double]
对结构体列表使用下标表达式可以扩充或缩减结构体列表.
student(2).name = 'Ann Lane';
student(2).id = 'aln4@sfu.ca';
student(2).number = 301078853;
student(2).grade = [95 100 90; 95 82 97; 100 85 100];
student
student(1) = [] % 删除student列表第一项
例2:
1 2 3 4 5 6 7 8 9 10 |
|
运行以上代码,得到:
person =
包含以下字段的 1×2 struct 数组:
name
weight
length
width
lengh
如果要获得结构体person中的域"name'的所有值,也就是得到两个人的名字,可以使用: str=[person.name]
(2)使用struct函数创建结构体
使用 struct 函数创建一个结构体数组。您可以同时指定许多字段,也可以创建一个非标量结构体数组。
基本语法:
s = struct
s = struct(field,value)
s = struct(field1,value1,...,fieldN,valueN)
s = struct([])
s = struct(obj)
其中:
field : 字段名称
字段名称,指定为字符向量或字符串标量。有效字段名称以字母开头,可以包含字母、数字和下划线。
value : 值
值,指定为任何类型的数组。是我们要存的数据!如果 value 有任何输入是非标量元胞数组,则所有非标量元胞数组输入必须具有相同的维度。如果 value 有任何输入是空元胞数组 {},则输出是空结构体数组。要指定单个空字段,请使用 []。
说明:
1) s = struct 创建不包含任何字段的标量 (1×1) 结构体。
2) s = struct(field,value) 创建具有指定字段和值的结构体数组。value 输入参数可以是任何数据类型,例如数值、逻辑值、字符、结构体、元胞数组。
如果 value 不是元胞数组,或者 value 是标量元胞数组,则 s 是标量结构体。例如,s = struct('a',[1 2 3]) 创建一个 1×1 结构体,其中 s.a = [1 2 3]。
如果 value 是非标量元胞数组,则 s 是维度与 value 相同的结构体数组。s 的每个元素包含 value 的对应元素。例如,s = struct('x',{'a','b'},'y','c') 返回 s(1).x = 'a'、s(2).x = 'b'、s(1).y = 'c' 和 s(2).y = 'c'。
如果 value 是空元胞数组 {},则 s 是空 (0×0) 结构体。
3) s = struct(field1,value1,...,fieldN,valueN) 创建多个字段。集合 value1,...,valueN 中的任何非标量元胞数组必须具有相同的维度。
如果 value 的所有输入都不是元胞数组,或者 value 中作为元胞数组的所有输入都是标量,则 s 是标量结构体。
如果所有 value 输入都是非标量元胞数组,则 s 具有与非标量元胞数组相同的维度。对于类型为标量元胞数组或任何其他数据类型的数组的任何 value,struct 将 value 的内容插入 s 的所有元素的相关字段中。
如果任何 value 输入是空元胞数组 {},则输出 s 是空 (0×0) 结构体。要指定一个空字段并保留其他字段的值,请改用 [] 作为 value 输入。
4) s = struct([]) 创建不包含任何字段的空 (0×0) 结构体。
例1:
1 2 3 4 5 6 7 |
|
例2:两种方法建立结构体对比
方法1. 数据量少时,可以直接赋值:
s.a = 1;
s.b = {'A','B','C'}
方法2. 数据量多时,使用struct函数创建结构体:s = struct(field1,value1,...,fieldN,valueN)
%先创建结构体的域的内容,
field1 = 'f1'; value1 = zeros(1,10);
field2 = 'f2'; value2 = {'a', 'b'};
field3 = 'f3'; value3 = {pi, pi.^2};
field4 = 'f4'; value4 = {'fourth'};
%再用struct函数拼接成一个结构体
s = struct(field1,value1,field2,value2,field3,value3,field4,value4)
结构体级联,即结构体中字段的取值也可以是结构体:
A(1) = struct('data' , [3 4 7; 8 0 1], ...
'nest' , struct('testnum', 'Test 1', ...
'xdata', [4 2 8], ...
'ydata', [7 1 6]));
A(2).data = [9 3 2; 7 6 5];
A(2).nest.testnum = 'Test 2';
A(2).nest.xdata = [3 4 2];
A(2).nest.ydata = [5 0 9];
A
% 也可以用下面的写法:
A = struct( 'data' , { [3 4 7; 8 0 1],[9 3 2; 7 6 5] },...
'nest' , {struct('testnum', 'Test 1', ...
'xdata', [4 2 8], ...
'ydata', [7 1 6]), ...
struct('testnum', 'Test 2', ...
'xdata', [3 4 2], ...
'ydata', [5 0 9])});
A
(3)访问结构体内部元素
获取:结构体名称.字段名
赋值:结构体名称.字段名 = 新值
1 2 3 4 5 6 7 8 9 10 |
|
例1:具有一个字段的结构体
创建包含一个字段(field)的非标量结构体。
field = 'f';
value = {'some text';[10, 20, 30]; magic(5)};
s = struct(field,value)
访问非标量结构体的字段(例如 s.f)时,MATLAB 返回一个逗号分隔的列表。 在本示例中,s.f 等效于 s(1).f, s(2).f, s(3).f这三个命令之和。
理解一下以下命令的原理:
例2:创建包含多个字段的非标量结构体。
field1 = 'f1'; value1 = {[1:10]}; %value值为一个数组,[1:10]
field2 = 'f2'; value2 = {'ab', 'cd'}; %value值为2个数组,分别是‘ab’与‘cd’
field3 = 'f3'; value3 = {pi, [11:15]}; %value值为2个数组,分别是pi,与[11:15]
field4 = 'f4'; value4 = {'fourth'}; %value值为一个数组,'fourth'
s = struct(field1,value1,field2,value2,field3,value3,field4,value4)
得到:
s = 1x2 struct array with fields:
f1
f2
f3
f4
value2 和 value3 的元胞数组是 1×2 数组,因此 s 也是 1×2 数组。因为 value1 是数值数组而不是元胞数组,所以 s(1).f1 和 s(2).f1 具有相同的内容。类似地,因为 value4 的元胞数组具有单一元素,所以 s(1).f4 和 s(2).f4 具有相同的内容。
分析并理解以下结果:(注意:要先索引到某个具体的field中的某个具体的某个value,才能继续索引这个value中的某个具体元素。)
结构体的常用函数
函数 | 作用 |
---|---|
struct | 创建结构体 |
struct2cell | 将结构体转换为元胞数组 |
cell2struct | 将元胞数组转换为结构体 |
isstruct | 判断某变量是否是结构体 |
structfun | 对结构体的每个字段都应用某函数 |
fieldnames | 获取结构体的所有字段名 |
isfield | 判断结构体是否包含某字段 |
getfield | 获取结构体某字段的值 |
setfield | 为结构体中的某字段赋值 |
rmfield | 删除结构体中的某字段 |
orderfields | 为结构体字段排序 |
rmfield( ): 删除结构体中的字段
语法:s = rmfield(s,field)
说明:s = rmfield(s,field) 从结构体数组 s 中删除指定的一个或多个字段。使用字符向量元胞数组或字符串数组指定多个字段。s 的维度保持不变。
例1:删除1个字段
定义一个包含名为 a、b 和 c 的字段的标量结构体。
s.a = 1;
s.b = 2;
s.c = 3;
%删除字段 b。
field = 'b';
s = rmfield(s,field)
s = struct with fields:
a: 1
c: 3
例2:删除多个字段
定义一个包含 first、second、third 和 fourth 字段的标量结构体。
S.first = 1;
S.second = 2;
S.third = 3;
S.fourth = 4;
%删除字段 first 和 fourth。
fields = {'first','fourth'};
S = rmfield(S,fields)
S = struct with fields:
second: 2
(4)table函数:
如果给定了不同的数据,我们也可以使用table函数,“一步登天”的创建好结构体
name = {'Mike';'John';'Sam';'Bob';'Brown'}; %字符串要用大括号
age = [38;43;38;40;49];
height = [71;69;64;67;64];
weight = [176;163;131;133;119];
bloodpressure = [124 93; 109 77; 125 83; 117 75; 122 80];
然后使用table函数创建
调用格式node=table(name1,name2,name3....)
node=table(name,age,height,weight,bloodpressure)
输出一下
node
![](https://pic2.zhimg.com/80/v2-687f546deaa0416b994501026650a25d_720w.jpg)
调用的时候要用两个坐标查询
node(1,2) %查询第一个结构体的第二个数据(age)
![](https://pic3.zhimg.com/80/v2-ac1162cce8d93230b408861b84ce64c6_720w.png)
我们还可以计算每一种数据的一些信息
比如查询年龄的最大值
max_age=max(node.age)
![](https://pic1.zhimg.com/80/v2-bbe2f502ab17d8c9cd15eb979ed01bac_720w.png)
如果想要添加变量,直接加就行
node.BMI=(node.weight*0.4)./(node.height*0.03).^2 %注意是点运算,不要搞成矩阵运算
node
![](https://pic3.zhimg.com/80/v2-e21b416011da8bffe7009d49b347b332_720w.jpg)
这样在后面就自动添加上了。
作业1:
(1)创建一个结构体数组student,要求:
包含4个field,依次为:'name','email','telephone','score';其中成绩要包含具体某个学生的5门课的成绩(可以用1*5的数组形式)。student要有3个具体实例,既,要有3个学生的资料, 比如student(1)、student(2)、student(3)就分别是这三个学生的结构体。
(2)索引各个学生的各种数据。
(3)删除某个学生,或者删除某个学生的某个field。
作业2:
(1)创建一个结构体color,用于存储多种颜色资料。color下面有3个field,依次为:'RGBname','RGBvalue','RGBmatrix'。'RGBmatrix'下面存300*300*3的颜色矩阵(3维矩阵)。结构体color至少包含8个具体实例,比如color(1)存黑色,color(2)存纯白色,color(3)紫色等等.
(2)访问这个结构体,显示其中某个颜色的资料。
比如访问第1个实例——color(1),效果如下