文件交换的选择

我们最好的用户提交

一个优雅的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++类类。

为什么所有的复杂性?这解决什么呢?

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

  1. 它演示了如何使用c++代码MEX-function上下文中的“安全”
  2. 它包括一个辅助文件和几个实用程序使第1部分容易。
  3. 它提供了一个示例使用自己的项目作为模板

棘手的部分使用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

|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。