从MATLAB中调用MEX中的C++类方法

Sri*_*utt 3 c c++ methods matlab mex

我有一个DLP工具包,我需要通过MATLAB使用C++ API进行控制.

比如,我{load_data, load_settings,display_data}在一个名为dlp_controller.cpp/.c的mex文件中使用C/C++的函数/方法.

我知道我可以dlp_controller();用MATLAB 打电话.

有没有办法可以直接从MATLAB调用这个mex的方法?

说我的dlp_controller.cpp mex看起来像:

class dlp{ ... }
dlp::dlp{ ... }
dlp::load_data{ ... }
dlp::load_settings{ ... }
dlp::display_data{ ... }

void mexFunction(int nlhs, mxArray *[],int nrhs, const mxArray *prhs[]{ ... }
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式调用dlp_controller.load_dataMATLAB中的方法吗?注意:解决方法可以是dlp_controller使用该函数和传递的数据向内部发送变量并调用该函数.

Pra*_*ian 6

AFAIK,没有直接的方法来做到这一点,因为mexFunction界面相当平坦.但是,我可以想到一些不同的解决方法,可以让你接近.根据您的需求选择最佳的一个.

  1. 最简单的方法是dlp在mex函数中创建类的全局实例.使mex函数的第一个参数调用一个字符串,该字符串指示调用全局对象的哪个成员函数.明显的缺点是你已经将你的mex功能变成了单身.

  2. 如果需要多个dlp实例,可以在mex函数中创建一个全局容器std::map<std::string, dlp>,然后dlp在MATLAB中通过某个名称引用每个实例.例如,要创建一个新实例,您可以使用名称中尚未存在的名称调用mex函数map.然后,您可以使用此名称调用mex函数,指示要调用的成员函数的字符串以及要传递给成员函数的任何参数.还设置了一些约定,您可以从中删除dlp实例map.

  3. 与第二个解决方案类似,dlp您可以将句柄返回到每个实例,而不是命名实例.例如,创建一个全球性的std::set<dlp *>,当你有MEX函数创建一个新的dlp实例,将其添加到set与指针的一个拷贝到所分配的对象返回到MATLAB(坚持在类型的标量mxUINT64_CLASS).后续调用来调用成员函数对象将在本通手柄变量从MATLAB的MEX功能,你会适当的MEX文件内施放的,内找到它set并调用成员函数.

这些方法都不是特别漂亮,但这些是我所知道的从mex文件中调用C++类的成员函数的唯一方法.

  • 如果需要动态分配单例,请确保使用`mexAtExit()`注册清理函数.还要考虑`mexLock()`和`mexUnlock()`以确保你的实例在你不期望的时候不会消失.所有这一切都是因为MEX DLL(或.so)在必要时动态加载,并在MATLAB认为不再需要时卸载. (3认同)