一个优雅的MATLAB c++包装器
格雷格的选择本周例子MATLAB c++类的类包装通过奥利弗·伍德福德。
你有一个c++类,在MATLAB要实例化。
如果您正在使用MATLAB R2019a或晚:检查直接调用MATLAB c++库
如果您使用的是R2018b或更早的版本中,你不能直接调用c++代码在MATLAB和通过MEX-File需要进口。
然而mex files只能提供一个MATLAB函数接口,你想从一个类实例化一个对象。现在你做什么工作?
奥利弗·伍德福德来救援的辉煌的例子如何结束你的c++类可以实例化
从MATLAB维护它。
剧透:我用这个出口作为一个MATLAB仿真软件模型类。金宝app
内容
一个漂亮的MEX-wrapper接口的类
因为mex files仅支持基于函数接口,金宝app我们需要创建一个包装器函数,使
- c++类实例化一个对象
- 调用这个对象的方法(或者改变属性值)
- 破坏的对象
采用c++类的不同方法,第一个输入参数MEX-function是用来识别方法
c++类的。
MEX-code
空白mexFunction (int nlhs mxArray * plhs [], int nrhs, const mxArray * prhs [])
{
/ /命令字符串
char methodId [64];
mxGetString (prhs [0], methodId sizeof (methodId))
mexPrintf(“* * *方法Id: % s \ n”, methodId);
}
MATLAB代码:
> > = myMexFunction (“myMethod”);
* * *方法Id: myMethod
> >
MEX-function作为附加参数的c++类的输入方法。
一旦MEX-function包装器和编译,就会创建一个MATLAB类,反映了c++类,并使用
MEX-function包装器映射的各种属性和方法的MATLAB c++类类。
为什么所有的复杂性?这解决什么呢?
有三个关键元素,使这个条目优秀。
- 它演示了如何使用c++代码MEX-function上下文中的“安全”
- 它包括一个辅助文件和几个实用程序使第1部分容易。
- 它提供了一个示例使用自己的项目作为模板
棘手的部分使用c++类时你想要类的多个实例之间存在调用
MEX-function包装。如果我们不小心,我们可以介绍内存泄漏。
这是奥利弗的条目的亮点。他出口类实例的引用回到MATLAB所以它的生命周期
一个MATLAB类实例的生命周期同步。
这就是这条线:
plhs [0] = convertPtr2Mat < CPP_CLASSNAME >(新CPP_CLASSNAME);
当创建一个c++类的新实例。处理新对象的输出MEX-function作为64位
整数。
该句柄可以指特定从MATLAB c++类的实例。因此你看到引用
来
objectHandle = prhs [1];CPP_CLASSNAME * cppObj = convertMat2Ptr < CPP_CLASSNAME > (objectHandle);
将64位整数处理MATLAB使用回在MEX-function本机c++类。
部署一个仿真软件M金宝appATLAB模型作为类
尝试这个条目,我使用仿真软件编码器生成一个c++类仿真软件模金宝app型
这个简单的模型配置为生成c++代码如c++类。
这个封装生成的代码提供的初始化方法,模型在每个样本时,和终止
的执行模型。
我没有使用默认的主要功能,而是复制MATLAB_ROOT / rtw / c / src /共同/ rt_cppclass_main。cpp作为新的CPP-file和改变了主要函数一mexFunction基于奥利弗的例子class_interface_mex.cpp。
相应的MATLAB类我这样写道:
类型(“basicSisoSystemInterface.m”)
% CLASS_INTERFACE例子MATLAB类包装一个潜在的c++类classdef basicSisoSystemInterface <处理属性(隐藏SetAccess =私人= true) ObjectHandle;%处理底层c++类实例方法结束% %构造函数,创建了一个新的c++类实例函数这= basicSisoSystemInterface(变长度输入宗量)。ObjectHandle = basicSisoSystem_mex(“新”,变长度输入宗量{:});% %析构函数——摧毁c++类实例函数删除(这)basicSisoSystem_mex(“删除”,this.ObjectHandle);结束% % sim -一个类方法调用函数varargout = sim(这一点,变长度输入宗量)[varargout {1: nargout}] = basicSisoSystem_mex (sim卡,这个。ObjectHandle,变长度输入宗量{:});结束结束结束
我包括一个名为“sim卡”的方法来执行c++版本的模型。
现在我可以调用两个不同的实例相同的模型。在这种情况下使用不同的输入。
modelObj1 = basicSisoSystemInterface;modelObj2 = basicSisoSystemInterface;着干活= sim (modelObj1 3 * 1 (100 1));out2 = sim (modelObj2 5 * (100 1));情节(着干活)在情节(out2)标题(多个实例模型输出的)包含(“时间(ms)”)ylabel (模型输出的)传说(“模型实例1”,《模型实例2》网格)在
你怎么认为?
让我们知道在这里。
发表与MATLAB®R2017b
- 类别:
- 先进的MATLAB,
- 金宝app
评论
留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。