3

我有一个 C++ 文件:

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

这工作正常。我现在想将第二行更改为

  • 来电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 文档中都找不到对这个函数的引用。那么如何使用这个呢?

4

5 回答 5

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
于 2012-12-07T07:58:41.580 回答
2

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

这篇博文的详细信息和代码可在 github 上找到

于 2012-02-06T15:30:09.493 回答
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
}
于 2016-02-24T08:17:39.087 回答
0

如果有办法做到这一点,我从来没有见过。更糟糕的是,您引用的 Matlab C++ 数学库不再存在:

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

于 2012-01-30T19:25:37.343 回答
0

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

于 2012-01-31T02:39:00.740 回答