一个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 ++类。
为什么这么复杂?这解决了什么问题?
有三个关键元素使这个词条优秀。
- 它演示了如何在MEX函数的上下文中“安全地”使用C ++代码
- 它包括具有多个实用程序的辅助文件,使第一部分简单。
- 它提供了一个示例,可作为您自己项目的模板使用
使用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
- 类别:
- 先进的MATLAB,
- 金宝app
评论
要发表评论,请点击这里要登录您的MathWorks帐户或创建新的。