MATLAB中定义结构体数组

最近使用MATLAB代码生成,结构体数组的问题困扰许久,先将支持代码生成的结构体数组创建方法总结如下,主要参考MATLAB帮助文档。

0. MATLAB中的结构体

结构体是使用被称为字段的数据容器将相关数据组合在一起的一种数据类型。每个字段都可以包含任意类型或任意大小的数据。
例:
将患者记录存储在含有字段 name、billing 和 test 的标量结构体中。
在这里插入图片描述

patient.name = 'John Doe';
patient.billing = 127.00;
patient.test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205];
patient
patient = struct with fields:
       name: 'John Doe'
    billing: 127
       test: [3x3 double]

1.添加下标创建数组

通过在数组名称后添加下标,可在此数组中添加其他患者的记录。
在这里插入图片描述

patient(2).name = 'Ann Lane';
patient(2).billing = 28.50;
patient(2).test = [68, 70, 68; 118, 118, 119; 172, 170, 169];
patient
patient=2×3 struct
    name
    billing
    test

数组中的每条患者记录都是 struct 类的结构体。由结构体构成的数组通常称为结构体数组。与其他 MATLAB 数组类似,结构体数组可以具有任意维度。
结构体数组具有下列属性:

  1. 数组中的所有结构体都具有相同数目的字段。
  2. 所有结构体都具有相同的字段名称。
  3. 不同结构体中的同名字段可包含不同类型或大小的数据。
    数组中新结构体的任何未指定字段均包含空数组。
patient(3).name = 'New Name';
patient(3)
ans = struct with fields:
       name: 'New Name'
    billing: []
       test: []

这种创建结构体数组的方式,很MATLAB,也是最方便的方式;然鹅,这种方式定义的结构体数组并不支持代码生成
下面介绍支持代码生成的结构体数组创建方式。

2.支持代码生成的结构体数组创建

2.0 字段的一致性要求

对于代码生成,创建 MATLAB® 结构体数组时,数组元素中的对应字段必须具有相同的大小、类型和复/实性。这句话看不懂没关系,继续往下看,就能懂了。

2.1使用 repmat 定义结构体数组

使用 MATLAB repmat 函数从标量结构体创建结构体数组,该函数将复制并平铺现有标量结构体:
三步:

  1. 创建一个标量结构体;
  2. 调用 repmat,传递标量结构体和数组的维度;
  3. 使用标准数组索引和结构体圆点表示法为每个结构体赋值。

例如,创建一个 1×3 标量结构体数组 X。数组中的每个元素都由结构体 s 定义,该结构体有两个字段,a 和 b。

%%%%1.创建一个标量结构体;
s.a = 0;%%double类型
s.b = 'a';%%char类型

%%%% 2.调用 repmat,传递标量结构体和数组的维度;
X = repmat(s,1,3);%% 1×3的数组

%%%% 3.使用标准数组索引和结构体圆点表示法为每个结构体赋值。
X(1).a = 1;%%给数组索引(1)的字段a赋值,double类型
X(1).b = 'a';%%给数组索引(1)的字段b赋值,char类型
X(2).a = 2;
X(2).b = 'b';
X(3).a = 3;
X(3).b = 'c';

完成定义,输出验证。

>> X.a

ans =
     1
ans =
     2
ans =
     3
     
>> X.b

ans =
    'a'
ans =
    'b'
ans =
    'c'

2.2使用 struct 定义结构体数组

要使用 struct 函数创建结构体数组,需要将字段值参数指定为元胞数组。每个元胞数组元素都是对应结构体数组元素中字段的值(如上文中的X,X.a的“a”即为字段,1 or 2 or 3 为“a”字段的值;同理“b”也为字段,a or b or c为“b”字段的值)。对于代码生成,结构体中的对应字段必须具有相同的类型。因此,字段值的元胞数组内的元素必须具有相同的类型。

例如,以下代码同样会创建一个 1×3 结构体数组。对于结构体数组中的每个结构体,a 的类型为 double,b 的类型为 char。

X = struct('a', {1 2 3}, 'b', {'a' 'b' 'c'});
%%%%{1 2 3}{'a' 'b' 'c'}为元胞数组,
%%%%{1 2 3}内具有相同的double类型,
%%%%{'a' 'b' 'c'}内具有相同的char类型

完成定义,输出验证。

clear;
ans =
     1
ans =
     2
ans =
     3
     
>> X.b

ans =
    'a'
ans =
    'b'
ans =
    'c'

2.3使用串联定义结构体数组

要创建小型结构体数组,可以使用方括号 ( [ ] ) 作为串联运算符将一个或多个结构体联接到一个数组中。请参阅创建、串联和扩展矩阵 (MATLAB)。对于代码生成,您串联的结构体必须具有相同的大小、类和复/实性

例如,以下代码使用串联和局部函数来创建 1×3 结构体数组的元素:

新建一个m函数:

function s = sab(a,b)
  s.a = a;
  s.b = b;

使用命令:

X = [ sab(1,'a') sab(2,'b') sab(4,'c') ];

结果与上述两种方式一致。

表述若有错误欢迎指正。本文主要参考MATLAB帮助文档1 MATLAB帮助文档2

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐