matlab之结构体数组struct
要在MALTAB中实现比较复杂的编程,就不能不用struct类型。而且在MATLAB中实现struct比C中更为方便。
1、结构体数组创建
创建结构体数组有两种方式,分别为直接创建和使用struct函数
1.1 直接创建
直接定义字段,像使用一般matlab变量一样,不需要事先声明,支持动态扩充。下面创建一个Student结构体数组:
Student.name = 'wangx';
Student.sex = 'Male';
Student.height = '170';
字段可以动态添加。
以上建立了单个结构体变量,下面将其扩充为结构体数组:
Student(2).name = 'zhangsan';
Student(2).sex = 'Male';
Student(2).height = 172;
1.2 使用struct函数
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'};
s = struct(field1,value1,field2,value2,field3,value3,field4,value4)
1、直接创建结构体
>> stu(1).name='zhangsan'; >> stu(1).age=28; >> stu(1).gender='male'; >> stu(2).name='lisi'; >> stu(2).age=29; >> stu(2).gender='male';
2、使用struct函数也可以创建结构,该函数产生或把其他形式的数据转换为结构数组。
struct的使用格式为:
s = sturct('field1',values1,'field2',values2,…);
结构体处理的的一些函数 :
1.删除结构体操作rmfield()
s2=rmfield(s1,’color’)%删除s1中的一个字段color
s2=rmfield(s1,{‘color’,‘type’})%删除s1中的2个字段color和type
2.isstruct(s2)-判断是否为结构体
3.isfield(s2,’a’)-判断’a’字段是否属于这个结构体
b=isfield(s,{‘type’,’color’})-同时判断两个字段是否属于结构体,返回值就是两个数。
4.fieldnames(s)-获取s结构体中的字段名字
5.orderfields(s)-对s结构体中的字段进行排序,按首字母顺序
6.getfield()-取得结构体字段的值
7.setfield()-对结构体的字段赋予新的值
8.struct2cell(s)-将结构体s转换为单元数组
这里以以K为例来验证这些参数
========================================
struct 结构体数组
说明
结构体数组是使用名为字段的数据容器将相关数据组合在一起的数据类型。每个字段都可以包含任意类型的数据。可以使用 structName.fieldName
格式的圆点表示法来访问字段中的数据。
创建对象
当您有数据要放入新的结构体中时,可以使用圆点表示法创建结构体,每次为结构体命名一个字段:
s.a = 1; s.b = {'A','B','C'}
s = struct with fields: a: 1 b: {'A' 'B' 'C'}
也可以按如下所述,使用 struct
函数创建一个结构体数组。您可以同时指定许多字段,也可以创建一个非标量结构体数组。
语法
s = struct(field1,value1,...,fieldN,valueN)
说明
s = struct
创建不包含任何字段的标量 (1×1) 结构体。
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'})
返回s(1).x = 'a'
和s(2).x = 'b'
。如果
value
是空元胞数组{}
,则s
是空 (0×0) 结构体。
s = struct(field1,value1,...,fieldN,valueN)
创建一个包含多个字段的结构体数组。
如果
value
的所有输入都不是元胞数组,或者value
中作为元胞数组的所有输入都是标量,则s
是标量结构体。如果任一
value
输入是非标量元胞数组,则s
具有与该元胞数组相同的维度。此外,如果两个或多个value
输入是非标量元胞数组,则它们必须都具有相同的维度。对于类型为标量元胞数组或任何其他数据类型的数组的任何
value
,struct
将value
的内容插入s
的所有元素的相关字段中。例如,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) 结构体。要指定一个空字段并保留其他字段的值,请改用[]
作为value
输入。
s = struct([])
创建不包含任何字段的空 (0×0) 结构体。
s = struct(
创建包含与 obj
)obj
的属性对应的字段名称和值的标量结构体。struct
函数不会转换 obj
,而是将 s
创建为一个新的结构体。此结构体不保留类信息,因此专用、受保护和隐藏的属性在 s
中变为公共字段。struct
函数在您使用此语法时会发出警告。
输入参数
field
- 字段名称
字符向量 | 字符串标量
字段名称,指定为字符向量或字符串标量。有效字段名称以字母开头,可以包含字母、数字和下划线。字段名称的最大长度是 namelengthmax
函数返回的值。
value
- 值
数组
值,指定为任何类型的数组。如果 value
有任何输入是非标量元胞数组,则所有非标量元胞数组输入必须具有相同的维度。
如果 value
有任何输入是空元胞数组 {}
,则输出是空结构体数组。要指定单个空字段,请使用 []
。
obj
- 对象
标量 | 数组
对象,指定为标量或对象数组。struct
函数将 obj
的属性复制到新标量结构体的字段中。
struct
函数不能基于大多数基本数据类型创建结构体。例如,如果 obj
具有 double
或 char
数据类型,则 struct
会发出错误消息。但是,struct
会将表或时间表的属性以结构体形式返回。请参阅 MATLAB 基础类获得基本数据类型的列表。
示例
在结构体中存储相关数据变量
在结构体的字段中存储相关数据片段。您可以为这些字段提供对数据进行描述的易读名称。
通过使用圆点表示法添加字段来创建一个结构体。这些字段包含正弦波的 x 值和 y 值以及描述数据的文本。
data.x = linspace(0,2*pi); data.y = sin(data.x); data.title = 'y = sin(x)'
data = struct with fields: x: [1x100 double] y: [1x100 double] title: 'y = sin(x)'
绘制正弦波。您可以按字段名称引用 x 和 y 值的数组。然后添加标题。
plot(data.x,data.y) title(data.title)
具有一个字段的结构体
创建包含一个字段的非标量结构体。
field = 'f'; value = {'some text'; [10, 20, 30]; magic(5)}; s = struct(field,value)
s=3×1 struct f
查看每个元素的内容。
s.f
ans = 'some text'
ans = 1×3 10 20 30
ans = 5×5 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
访问非标量结构体的字段(例如 s.f
)时,MATLAB® 返回一个逗号分隔的列表。在本示例中,s.f
等效于 s(1).f, s(2).f, s(3).f
。
具有多个字段的结构体
创建包含多个字段的非标量结构体。
field1 = 'f1'; value1 = zeros(1,10); field2 = 'f2'; value2 = {'a', 'b'}; field3 = 'f3'; value3 = {pi, pi.^2}; field4 = 'f4'; value4 = {'fourth'}; s = struct(field1,value1,field2,value2,field3,value3,field4,value4)
s=2×4 struct 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
具有相同的内容。
s(1)
ans = struct with fields: f1: [0 0 0 0 0 0 0 0 0 0] f2: 'a' f3: 3.1416 f4: 'fourth'
s(2)
ans = struct with fields: f1: [0 0 0 0 0 0 0 0 0 0] f2: 'b' f3: 9.8696 f4: 'fourth'
带有空字段的结构体
创建包含一个空字段的结构体。使用 []
指定空字段的值。
s = struct('f1','a','f2',[])
s = struct with fields: f1: 'a' f2: []
包含元胞数组的字段
创建具有一个字段的一个结构体,该字段包含一个元胞数组。
field = 'mycell'; value = {{'a','b','c'}}; s = struct(field,value)
s = struct with fields: mycell: {'a' 'b' 'c'}
空结构体
创建包含多个字段的空结构体。
s = struct('a',{},'b',{},'c',{})
s = 0x0 empty struct array with fields: a b c
为空结构体中的字段赋值。
s(1).a = 'a'
s = struct with fields: a: 'a' b: [] c: []
嵌套结构体
创建一个嵌套结构体,其中 a
是具有一个字段的结构体,该字段又包含另一个结构体。
a.b = struct('c',{},'d',{})
a = struct with fields: b: [0x0 struct]
查看 a.b
的字段的名称。
fieldnames(a.b)
ans = 2x1 cell array {'c'} {'d'}
========================================================
avgscore.m
function avg = avgscore(testscores, student, first, last)
testscores.Ann_Lane.week(1:25) = ...
[95 89 76 82 79 92 94 92 89 81 75 93 ...
85 84 83 86 85 90 82 82 84 79 96 88 98];
testscores.William_King.week(1:25) = ...
[87 80 91 84 99 87 93 87 97 87 82 89 ...
86 82 90 98 75 79 92 84 90 93 84 78 81];
for k = first : last
scores(k) = testscores.(student).week(k);
end
avg = sum(scores)/(last - first + 1);
end
%% 结构体
S = struct('name', 'Ed Plum','score', 83, 'grade','B+')
S(2).name = 'Toni Miller';
S(2).score = 91;
S(2).grade = 'A-';
S(3) = struct('name','Jerry Garcia',...
'score',70,'grade','C')
%S.name
%S.score
%S(1).score, S(2).score, S(3).score
%S.grade
scores = [S.score]
avg_score = sum(scores) / length(scores)
% 创建字符数组
names = char(S.name)
% 创建元胞数组
names = {S.name}
% 将结构体数组的每个元素的字段赋值给结构体外部的单独变量
[N1 N2 N3] = S.name
%% 动态字段名称
% 访问结构体中的数据的最常用方法是指定要引用的字段的名称
% 访问结构体数据的另一种方法是使用动态字段名称
% 此处显示的点-括号语法将 expression 作为动态字段名称
% structName.(expression)
% structName.(expression)(7,1:25)
testscores.Ann_Lane.week(1:25) = ...
[95 89 76 82 79 92 94 92 89 81 75 93 ...
85 84 83 86 85 90 82 82 84 79 96 88 98];
testscores.William_King.week(1:25) = ...
[87 80 91 84 99 87 93 87 97 87 82 89 ...
86 82 90 98 75 79 92 84 90 93 84 78 81];
avgscore(testscores, 'Ann_Lane', 7, 22)
avgscore(testscores, 'William_King', 7, 22)
=============================================
==============================
代码实例:
data= struct ; % s = struct 创建不包含任何字段的标量 (1×1) 结构体。
data.x = linspace(0,2*pi);
data.y = sin(data.x);
data.title = 'y = sin(x)';
data
plot(data.x,data.y)
title(data.title)
%%%%%%%%%%%%%
field = 'f';
value = {'some text';
[10, 20, 30];
magic(5)};
s = struct(field,value)
s(2).f
s(3).f
%%%%%%%%%%%%%%%%%%
%%% struct建立方法1
s = struct;
s.f1=zeros(1,10);
s.f2=rand(2,6);
s.f3=3;
s.f4=magic(3);
s
s(1).f1
s(1).f2
s(1).f3
s(1).f4
%%%%%%%%%%%%%%%%%%
%%% struct建立方法2
field1 = 'f1'; value1 = zeros(1,10);
field2 = 'f2'; value2 = rand(2,6);
field3 = 'f3'; value3 = 3;
field4 = 'f4'; value4 = magic(3);
s = struct(field1,value1,field2,value2,field3,value3,field4,value4)
s(1).f1
s(1).f2
s(1).f3
s(1).f4
s(2).f4 %错误 : 索引超出数组范围。
%%%%%%%%%%%%%%%%%%
field1 = 'f1'; value1 = zeros(1,10);
field2 = 'f2'; value2 = {'a', 'b'};
field3 = 'f3'; value3 = {pi, pi.^2};
field4 = 'f4'; value4 = {'fourth'};
s = struct(field1,value1,field2,value2,field3,value3,field4,value4)
s(1).f1
s(2).f1
s(1).f2
s(2).f2
s(1).f3
s(2).f3
s(1).f4
s(2).f4
s(1)
s(2)
%% 嵌套结构体
A = struct;
A.a = struct('c',{'cat','dog'},'d',{'bird','tree'});
A.b = struct('e',{'face','leg'},'f',{12,25});
A
A.a.c
A.a(1).c
A.a(1).c(3)
A.b.f
A.b(2).f
%% 元胞数组与结构体数组
% 此示例比较元胞和结构体数组,并说明如何在每种类型的数组中存储数据。
% 使用元胞和结构体数组都可以存储不同类型和大小的数据。
% 结构体数组: 结构体数组中数据包含在可按名称访问的字段中。
%
% 例如,将患者记录存储在一个结构体数组中。
patient(1).name = 'John Doe';
patient(1).billing = 127.00;
patient(1).test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205];
patient(2).name = 'Ann Lane';
patient(2).billing = 28.50;
patient(2).test = [68, 70, 68; 118, 118, 119; 172, 170, 169];
patient
% 为每位患者的测试结果创建一个条形图。
numPatients = numel(patient); %n=numel(A)该语句返回数组中元素的总数。
for p = 1:numPatients
figure
bar(patient(p).test)
title(patient(p).name)
xlabel('Test')
ylabel('Result')
end
%% 元胞数组
% 元胞数组
% 元胞数组中数据包含在可按数值索引访问的元胞中。
% 元胞数组的常见应用包括存储单独的文本段,以及存储电子表格中的异类数据。
%
% 例如,在一个元胞数组中存储一段时间中三个城市的温度数据。
temperature(1,:) = {'2009-12-31', [45, 49, 0]};
temperature(2,:) = {'2010-04-03', [54, 68, 21]};
temperature(3,:) = {'2010-06-20', [72, 85, 53]};
temperature(4,:) = {'2010-09-15', [63, 81, 56]};
temperature(5,:) = {'2010-12-09', [38, 54, 18]};
temperature
% 按日期绘制每个城市的温度。
allTemps = cell2mat(temperature(:,2));
dates = datetime(temperature(:,1));
plot(dates,allTemps)
title('Temperature Trends for Different Locations')
xlabel('Date')
ylabel('Degrees (Fahrenheit)')