在MATLAB中定义结构体数组 -- 支持代码生成

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

在Unity使用Matlab生成.dll文件的步骤如下: 1. 首先,确保你的计算机上已经安装了Matlab和Unity。 2. 在Matlab,编写你需要用于导出的函数代码。确保你的函数输入和输出参数是适用于Unity的数据类型,例如基本数据类型(int,float等)、数组或结构体。 3. 使用Matlab的“mcc”命令将你的Matlab代码编译成可执行文件,并同时生成C源文件。例如,在Matlab命令行输入: mcc -W lib:MyMatlabLib -T link:lib myMatlabFunction.m 这将生成一个名为“MyMatlabLib”(也可以自定义名称)的文件夹,并包含一个C源文件和其他必需的文件。 4. 打开Unity,在Assets文件夹下创建一个名为“Plugins”的文件夹。 5. 将之前生成的C源文件(通常是形如“MyMatlabLib.c”的文件)复制到“Plugins”文件夹。 6. 在Unity创建一个C#脚本,以调用你在Matlab编写并编译的函数。在脚本使用[DllImport]来导入.dll文件,并定义需要导入的函数签名。例如: [DllImport("MyMatlabLib")] private static extern int myMatlabFunction(int input1, float input2, ref float output); 7. 在Unity的任何可执行代码(例如Start或Update方法)使用刚刚定义的函数。例如: float outputValue = 0.0f; int result = myMatlabFunction(10, 5.0f, ref outputValue); 这将调用你在Matlab编写的函数,将输入参数(10和5.0)传递给函数,并将计算结果存储在outputValue变量。 8. 现在,你可以在Unity使用Matlab函数生成的.dll文件了。 需要注意的是,在使用Matlab生成.dll文件时,确保你的Matlab代码和Unity的项目具有相同的位数和平台(32位或64位)。 另外,还需要注意的是,.dll文件不能直接在移动设备上使用,因为移动设备不支持生成和使用.dll文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值