将C/C++回调传递到matlab引擎中

Passing C/C++ callbacks into the matlab engine

本文关键字:matlab 引擎 C++ 回调      更新时间:2023-10-16

我有一个C++文件:

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

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

  • 调用matlab_optimize(obj_fun)

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

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

2009年的一篇新闻组帖子似乎表明这是不可能的。然后,Matlab C++数学库工具箱似乎能够做到这一点。

谷歌搜索还显示了这个生成的片段:

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

这似乎正是我想要的,但文件来自2000年,我在任何地方的matlab文档中都找不到这个函数的参考。那么如何使用它呢?

您可以使用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

我就这个问题联系了Mathworks,并设法让它全部正常工作。这个问题是将Python函数的回调直接传递给Matlab的更广泛努力的一部分。

github上提供了关于这篇博客文章和代码的全部详细信息。

我要感谢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
}

如果有办法做到这一点,我从未见过。更糟糕的是,你引用的Matlab C++数学库已经不存在了:

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

似乎可以从任何MATLAB函数创建一个c链接库(请参见此处)。如果这能像广告中说的那样奏效,我认为你应该能够以不同的方式做你想做的事。