将C/C++回调传递到matlab引擎中
Passing C/C++ callbacks into the matlab engine
我有一个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链接库(请参见此处)。如果这能像广告中说的那样奏效,我认为你应该能够以不同的方式做你想做的事。
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 当使用带有VS2019或VSCode的虚幻引擎4.24.2时,我如何修复这些错误的Intellisense错误
- Unity在虚幻引擎4中的"Vector3.Slerp"等效C++?
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- 在虚幻引擎中删除NXOpen对象时崩溃
- C++使用 MATLAB 引擎和 g++ 进行源代码编译
- 解释memcpy(MatLab引擎)的使用
- 使用matlab引擎编译c++程序eclipse
- 使用 Matlab 引擎的多线程C++应用程序
- 在不使用mex的情况下,将C++回调作为函数句柄传递给matlab引擎
- 加速Matlab引擎调用
- MATLAB mex API与MATLAB引擎API之间的差异
- 矩阵引擎"Can't start MATLAB engine"
- 将C/C++回调传递到matlab引擎中
- Matlab引擎数据检索失败
- 尝试使用VC++中的matlab引擎时出错
- MATLAB引擎Windows 7问题
- Matlab引擎API的线程安全性