本周的文件交换选择

我们最好的用户提交

一个Classy MATLAB包装您的c++

格雷格的本周是示例MATLAB类包装一个c++类通过奥利弗·伍德福德

您有一个C ++类,您希望在Matlab中实例化。

如果您正在使用MATLAB R2019a或更高版本:请查看直接从MATLAB调用c++库

如果您使用的是R2018B或更早版本,则无法直接在MATLAB中调用C ++代码,需要通过MEX文件导入。

然而MEX文件只能为matlab提供函数界面,您希望从类中实例化对象。现在你做什么?

Oliver Woodford提供了一个很好的例子来拯救你的c++类,这样你就可以实例化它
从MATLAB维护它。

剧透:我使用这个导出Simulink模型作为MATLA金宝appB类。

内容

一个漂亮的mex-wrapper与班级接口

由于MEX-FILES仅支持基于功能的接口金宝app,我们需要创建一个包装器功能

  • 将C ++类实例化为对象
  • 调用对象上的方法(或更改属性值)
  • 摧毁对象

为了使用c++类的不同方法,mex -函数的第一个输入参数用于标识哪个方法
将调用C ++类。

MEX-code

int nrhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]

//获取命令字符串

char methodId [64];

mxgetString(PRHS [0],MethodId,sizeof(MethodId))

MEXPRINTF(“***方法ID:%s \ n”,methodid);

MATLAB代码:

>> out = myMexFunction(' myMethod ', in);

* * *方法Id: myMethod

>>

mex -函数的附加参数用作c++类方法的输入。

MEX函数包装器到位并编译后,将创建MATLAB类,其镜像C ++类,并使用它
MEX函数包装器将MATLAB类的各种属性和方法映射到C ++类。

为什么这么复杂?这解决了什么问题?

有三个关键元素使这个词条优秀。

  1. 它演示了如何在MEX函数的上下文中“安全地”使用C ++代码
  2. 它包括具有多个实用程序的辅助文件,使第一部分简单。
  3. 它提供了一个示例,可作为您自己项目的模板使用

使用c++类的棘手之处在于,您希望在调用之间保持类的多个实例
到MEX函数包装器。如果我们不小心,我们可以介绍内存泄漏

这就是奥利弗的切入点。他将类实例的引用导出到MATLAB,这样它的生命周期就可以
与MATLAB类实例的生命周期同步。

这一行是这样写的:

pls [0] = convertPtr2Mat(new CPP_CLASSNAME); / /新建CPP_CLASSNAME

创建C ++类的新实例时是否会。从MEX函数输出到新对象的句柄作为64位
整数。

这个句柄可以用来引用MATLAB中的c++类的特定实例。因此,你们可以看到参考文献

ObjectHandle = PRHS [1];

CPP_CLASSNAME *cppObj = convertMat2Ptr(objecthhandle);

转换MATLAB返回MEX函数内的本机C ++类的64位整数句柄。

将Simulink金宝app模型部署为Matlab类

要尝试此条目,我使用Simulink编码器为Simulink金宝app模型生成C ++类

这个简单的模型被配置成生成c++代码作为c++类。

这封装了所生成的代码,提供初始化的方法,踩踏模型,并终止
执行模型。

我没有使用默认的主函数,而是将MATLAB_ROOT / RTW / C / SRC / Common / RT_CPPCLASS_MAIN.cpp作为新的CPP文件复制并更改主要函数一mexFunction基于奥利弗的例子class_interface_mex.cpp

我写的相应Matlab类看起来像这样:

类型('basicsisosysysteminterface.m'
%class_interface示例matlab类包装器到底层c ++类classdef basicsisysysteminterface 
            

我包含了一个名为“sim”的方法来执行模型的c++版本。

现在我可以调用同一个模型的两个不同实例。在这种情况下,不同的输入。

modelobj1 = basicsisosysysteminterface;modelobj2 = basicsisosysysteminterface;Out1 = SIM(Modelobj1,3 * of(100,1));OUT2 = SIM(Modelobj2,5 * ofon(100,1));情节(OUT1)持有情节(OUT2)标题(“多实例模型输出”)包含(“时间(ms)”) ylabel (模型输出的) 传奇(“模型实例1”《模型实例2》) 网格

你觉得呢?

让我们知道这里

发布与MATLAB®R2017b

|

评论

要发表评论,请点击这里要登录您的MathWorks帐户或创建新的。