ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-23 13:15:00  阅读:197  来源: 互联网

标签:matlab-deployment mex c matlab 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文档中都没有引用此函数.那怎么用呢?

解决方法:

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

标签:matlab-deployment,mex,c,matlab,matlab-engine
来源: https://codeday.me/bug/20190723/1513942.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有