将C/C++回调传递给matlab引擎

dgo*_*sen 3 c++ matlab mex matlab-engine matlab-deployment

我有一个C++文件:

  • 启动matlab引擎
  • 调用matlab_optimize()(在内部运行matlab优化器之一的已编译m文件)
  • 打印结果
  • 停止发动机并退出

这很好用.我现在想把第二行改成

  • 电话 matlab_optimize(obj_fun)

obj_fun()在我的C++代码中定义的函数在哪里,它本身将回调到其他代码中.基本上我希望内部matlab_optimize使用的matlab优化器使用我提供的函数指针作为目标函数.

我不能编译obj_fun()成一个独立的mex文件,因为我希望它与启动matlab引擎的c ++进程通信(驱动整个事情).

2009年的新闻组帖子似乎表明这是不可能的.然后,Matlab C++ Math Library Toolbox 似乎也能够做到这一点.

谷歌搜索也揭示了这个生成的片段:

/*
 * Register a function pointer as a MATLAB-callable function.
 */
extern void mexRegisterFunction(void);
Run Code Online (Sandbox Code Playgroud)

这似乎正是我想要的,但文件来自2000,我发现在任何地方的matlab文档中都没有引用此函数.那怎么用呢?

tot*_*oro 5

您可以使用mclmcrrt.h标头中的mclCreateSimpleFunctionHandle函数来创建此功能.

它将带有原型void(*)(int,mxArray*,int, mxArray)的函数转换为mxArray 结构.

您可以将其传递给MATLAB端函数,并将其称为通用MATLAB函数,而无需对mex文件进行任何操作.

在C/C++方面:

void callback(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
{
   <some manipulations with data>;
}

...
//calling the matlab function
matlab_function(mclCreateSimpleFunctionHandle(callback));
Run Code Online (Sandbox Code Playgroud)

在MATLAB方面:

function [] = matlab_function(function)
    function(<any variable>)
end
Run Code Online (Sandbox Code Playgroud)