我有一个C ++文件:
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文档中都没有对此函数的引用。那么如何使用呢?
答案 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的更广泛努力的一部分。
答案 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)。如果按照宣传的方式工作,我认为你应该能够以不同的方式做你想做的事。