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

时间:2012-01-30 18:09:15

标签: c++ matlab mex matlab-deployment matlab-engine

我有一个C ++文件:

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

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

  • 致电matlab_optimize(obj_fun)

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

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

A newsgroup post from 2009似乎表明这是不可能的。然后是Matlab C ++ Math Library Toolbox does seem to be able to do this

也在谷歌上搜索reveals this generated snippet

/*
 * Register a function pointer as a MATLAB-callable function.
 */
extern void mexRegisterFunction(void);

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

5 个答案:

答案 0 :(得分: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));

在MATLAB方面:

function [] = matlab_function(function)
    function(<any variable>)
end

答案 1 :(得分:2)

我与Mathworks就此问题进行了联系并设法使其全部正常运行。这个问题是能够将回调函数直接传递给Matlab的更广泛努力的一部分。

this blog postcode available on github的详细信息。

答案 2 :(得分:2)

我要感谢totoro的有用评论,这里有一些关于C ++方面的更详细的实现示例:

void fromMatlabCallback(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
{
  cout << "WOW I'm from Matlab. and it passes me a param: ";
  int aa = mxGetScalar(prhs[0]); // it is first param; nrhs tells how many there are
  cout << aa << "\n";
}

void InitializingFunc()
{
  mxArray *func_ptr = mclCreateSimpleFunctionHandle(fromMatlabCallback);
  mxArray *retVal_ptr = NULL;
  mlfUntitled(1, &retVal_ptr , func_ptr); //Untitled is name of my main Matlab func
}

答案 3 :(得分:0)

如果有办法做到这一点,我从未见过它。更糟糕的是,您引用的Matlab C ++ Math Library不再存在:

http://www.mathworks.com/matlabcentral/newsreader/view_thread/267802

答案 4 :(得分:0)

您似乎可以从任何MATLAB函数创建一个c-linkable库 (see here)。如果按照宣传的方式工作,我认为你应该能够以不同的方式做你想做的事。