最近使用MATLAB代码生成,结构体数组的问题困扰许久,先将支持代码生成的结构体数组创建方法总结如下,主要参考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]
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 数组类似,结构体数组可以具有任意维度。
结构体数组具有下列属性:
patient(3).name = 'New Name';
patient(3)
ans = struct with fields:
name: 'New Name'
billing: []
test: []
这种创建结构体数组的方式,很MATLAB,也是最方便的方式;然鹅,这种方式定义的结构体数组并不支持代码生成。
下面介绍支持代码生成的结构体数组创建方式。
对于代码生成,创建 MATLAB® 结构体数组时,数组元素中的对应字段必须具有相同的大小、类型和复/实性。这句话看不懂没关系,继续往下看,就能懂了。
使用 MATLAB repmat 函数从标量结构体创建结构体数组,该函数将复制并平铺现有标量结构体:
三步:
例如,创建一个 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'
要使用 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'
要创建小型结构体数组,可以使用方括号 ( [ ] ) 作为串联运算符将一个或多个结构体联接到一个数组中。请参阅创建、串联和扩展矩阵 (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。