MATLAB中的结构体与C语言中的结构体类似, 一个结构体可以通过字段存储多个不同类型的数据。因此, 结构体相当于一个数据容器,把多个相关联的不同类型的数据封装在一个结构体对象中。

结构体数组是使用名为字段的数据容器将相关数据组合在一起的数据类型。每个字段都可以包含任意类型的数据,可以是向量、数组、矩阵甚至是其他结构变量或元胞数组,而且不同字段之间其数据类型不需要相同。

1.创建结构体的方法

方法1:直接通过赋值语句给结构体的字段赋值。像使用一般matlab变量一样,不需要事先声明,支持动态扩充。在对结构体的字段进行赋值时,赋值表达式的变量名使用“结构体名称.字段名称”的形式书写, 对同一个结构体可以进行多个字段的赋值。

实例1

clc;
clear all;
close all;
STU.name = "张三";
STU.age = 25;
STU.number = 2016550418;
STU.grade = [55 65 75];
STU.subject = {'Chinese','Math','history'};
whos  
% 列出工作区中的变量及大小和类型 
% 此 MATLAB 函数 按字母顺序列出当前活动工作区中的所有变量的名称、大小和类型。
STU(2).name = "李四";
STU(2).age = 24;
STU(2).number = 2016550419;
STU(2).grade = [50 60 70];
STU(2).subject = {'Chinese','Math','history'};
whos
STU

运行结果

  Name      Size            Bytes  Class     Attributes
  STU       1x1              1450  struct              
  Name      Size            Bytes  Class     Attributes
  STU       1x2              2580  struct              
STU = 
  包含以下字段的 1×2 struct 数组:
    name
    age
    number
    grade
    subject

whos函数
whos - 列出工作区中的变量及大小和类型,此 MATLAB 函数 按字母顺序列
出当前活动工作区中的所有变量的名称、大小和类型。
who函数
who - 列出工作区中的变量, 此 MATLAB 函数 按字母顺序列出当前活动工
作区中的所有变量的名称。

方法2:使用结构体创建函数struct。

structural array=struct('field1',value1,field2',value2......)

其中structural array是结构体的名字,field和value分别表示在这个结构体下的属性和他们的值。

2.结构体的使用

使用structName.fieldName格式的圆点表示法来访问结构体中的数据。

实例2

clc;
clear all;
close all;
% 方法2:使用结构体创建函数struct。
% structural array=struct('field1',value1,field2',value2......)
% 其中structural array是结构体的名字,field和value分别表示在这个结构体下的属性和他们的值。
STU = struct('name','张三','age',15,'number',2016550418,'grade',...
    [56 78 90],'subject',{'Chinese','Math','history'});
STU1 = struct('name','张三','age',15,'number',2016550418,'grade',...
    {[56 78 90]},'subject',{{'Chinese','Math','history'}});
STU2 = struct('name',{'张三','李四','王五'},'age',{15,25,35},'number',...
    {2016550418,2016550419,2016550420},'grade',{[56 78 90],[55 65 75],[75 85 90]},...
'subject',{{'Chinese','Math','history'},{'Chinese','Math','history'},{'Chinese','Math','history'}});
whos
STU2(1) %查看结构数组的第一个元素的各个字段的内容
STU2(2)%查看结构数组的第二个元素的各个字段的内容
STU2(3)%查看结构数组的第三个元素的各个字段的内容
STU2(4) = struct('name','张可','age',16,'number',2016550421,'grade',...
    {[57 56 91]},'subject',{{'Chinese','Math','history'}});%增加结构体内容
%使用structName.fieldName格式的圆点表示法来访问结构体中的数据。
STU2.name %获取结构体STU2中的第一个字段的内容
S_name1 = STU2.name%获取结构体STU2中的第一个元素的name字段的内容
S_name2 = STU2(1).name%获取结构体STU2中的第一个元素的name字段的内容
S_age3 = STU2(3).age  %获取结构体STU2中的第一个元素的age字段的内容

运行结果

  Name      Size            Bytes  Class     Attributes
  STU       1x3              2168  struct              
  STU1      1x1              1296  struct              
  STU2      1x3              3248  struct              
ans = 
  包含以下字段的 struct:
       name: '张三'
        age: 15
     number: 2.0166e+09
      grade: [56 78 90]
    subject: {'Chinese'  'Math'  'history'}
ans = 
  包含以下字段的 struct:
       name: '李四'
        age: 25
     number: 2.0166e+09
      grade: [55 65 75]
    subject: {'Chinese'  'Math'  'history'}
ans = 
  包含以下字段的 struct:
       name: '王五'
        age: 35
     number: 2.0166e+09
      grade: [75 85 90]
    subject: {'Chinese'  'Math'  'history'}
ans =
    '张三'
ans =
    '李四'
ans =
    '王五'
ans =
    '张可'
S_name1 =
    '张三'
S_name2 =
    '张三'
S_age3 =
    35
>> 

3.MATLAB中专门用于对结构数组的操作的函数

表1 结构数组的操作函数

函数名

功能描述

deal

把输入处理成输出

fieldnames

获取结构的字段名

getfield

获取结构中指定字段的值

rmfield

删除结构的字段(不是字段内容)

setfield

设置结构数组中指定的字段的值

struct

创建结构数组

struct2cell

结构数组转化成元胞数组

isfield

判断是否存在该字段

isstruct

判断某变量是否是结构类型

rmfield – 删除结构体中的字段

  此 MATLAB 函数 从结构体数组 s 中删除指定的一个或多个字段。
  使用字符向量元胞数组或字符串数组指定多个字段。s 的维度保持不变。
  s = rmfield(s,field)

实例3

clc;
clear all;
close all;
STU = struct('name','张三','age',15,'number',2016550418,'grade',...
    [56 78 90],'subject',{'Chinese','Math','history'})
%fieldnames(s)-获取s结构体中的字段名字
S = fieldnames(STU)  
%isstruct(s2)-判断是否为结构体,返回是逻辑值
T = isstruct(STU)
T1 = isstruct(S)
%isfield(s2,’a’)-判断’a’字段是否属于这个结构体,返回是逻辑值
T2 = isfield(STU,'age')
T3 = isfield(STU,'Age')
%orderfields(s)-对s结构体中的字段进行排序,按首字母顺序
STU3 = orderfields(STU)
% 删除结构体操作rmfield()  s = rmfield(s,field)
STU = rmfield(STU,'age')%删除STU中的一个字段age,再赋值给STU
STU1 =  rmfield(STU,{'grade','number'})

运行结果


STU = 
  包含以下字段的 1×3 struct 数组:
    name
    age
    number
    grade
    subject
S =
  5×1 cell 数组
    {'name'   }
    {'age'    }
    {'number' }
    {'grade'  }
    {'subject'}
T =
  logical
   1
T1 =
  logical
   0
T2 =
  logical
   1
T3 =
  logical
   0
STU3 = 
  包含以下字段的 1×3 struct 数组:
    age
    grade
    name
    number
    subject
STU = 
  包含以下字段的 1×3 struct 数组:
    name
    number
    grade
    subject
STU1 = 
  包含以下字段的 1×3 struct 数组:
    name
    subject

getfield – 结构体数组字段

此 MATLAB 函数 返回结构体 S 的指定字段中的值。例如,如果 S.a=1,则 getfield(S,'a') 返回 1。

    value = getfield(S,field)
    value = getfield(S,field1,...,fieldN)
    value = getfield(S,idx,field1,...,fieldN)
    value = getfield(S,idx,field1,idx1,...,fieldN,idxN)

实例4


clc;
clear all;
close all;
%getfield()-取得结构体字段的值
STU2 = struct('name',{'张三','李四','王五'},'age',{15,25,35},'number',...
    {2016550418,2016550419,2016550420},'grade',{[56 78 90],[55 65 75],[75 85 90]},...
'subject',{{'Chinese','Math','history'},{'Chinese','Math','history'},{'Chinese','Math','history'}});
name1 = getfield(STU2,{1,1},'name')
name2 = getfield(STU2,{1,2},'name')
name3 = getfield(STU2,{1,3},'name')
grade1 = getfield(STU2,{1,1},'grade')
%setfield()-对结构体的字段赋予新的值
setfield(STU2,{1,1},'name','郭三');
STU2(1).name
STU2 = setfield(STU2,{1,1},'name','郭三');
STU2(1).name
%struct2cell(s)-将结构体s转换为单元数组
C1 = struct2cell(STU2)

运行结果


name1 =
    '张三'
name2 =
    '李四'
name3 =
    '王五'
grade1 =
    56    78    90
ans =
    '张三'
ans =
    '郭三'
>> %struct2cell(s)-将结构体s转换为单元数组
C1 = struct2cell(STU2)
  5×1×3 cell 数组
C1(:,:,1) = 
    {'郭三'      }
    {[        15]}
    {[2.0166e+09]}
    {1×3 double  }
    {1×3 cell    }
C1(:,:,2) = 
    {'李四'      }
    {[        25]}
    {[2.0166e+09]}
    {1×3 double  }
    {1×3 cell    }
C1(:,:,3) = 
    {'王五'      }
    {[        35]}
    {[2.0166e+09]}
    {1×3 double  }
    {1×3 cell    }
>> 

参考内容

[1] CSDN博主PuddingHouChou的文章《MATLAB学习——结构体类型》,文章链接为:

[2] 知乎作者Chenglin Li的文章《matlab学习笔记(四)结构体》,文章链接为:

[3] 简书作者离入门还差一米的文章《MATLAB 数据类型中的结构体类型,及其构造方法》,文章链接为:

[4] 51CTO博客作者Iamlibby的文章《matlab中使用结构体(1) 》,文章链接为:

限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: lzxmw777

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注