新闻中心

EEPW首页 > EDA/PCB > 设计应用 > Matlab与C/C++混合编程接口及应用

Matlab与C/C++混合编程接口及应用

作者:时间:2012-08-27来源:网络收藏

2.2 调用C/C++动态连接库

提供对动态连接库DLL 文件的[7]。利用该,可在 中调用动态连 接库导出的函数。 对DLL 的支持各种语言编写的DLL 文件。在调用DLL 文件之 前,需要准备函数定义的头文件。对于C/C++语言开发的DLL 文件,可使用源程序中相应的 头文件;而对于其他语言开发的DLL,则要手工准备等效的C 语言函数定义头文件。

在Matlab 中利用动态连接库接口技术通常需要完成以下4 个步骤:

(1)打开动态连接库文件;(2)为调用函数准备数据;(3)调用动态连接库文件中导出的 函数;(4)关闭动态连接库文件。

为了实现以上步骤,用到的Matlab 函数有:loadlibrary,loadlibrary,calllib, libfunctions,lipointer,libstruct,libisloaded。下面举例说明Matlab 调用C/C++动态 连接库的方法和步骤:

a.在VC 环境下,新建工程->win32 动态连接库->工程名Test1->empty 工程->完成;

b.新建->C++源文件->添加a.cpp,内容为: #include a.h

_declspec(dllexport) int add(int a, int b) { return a+b; }

c.新建->C/C++头文件->添加a.h,内容为: _declspec(dllexport) int add(int a,intb);然后编译生成Test1.dll 动态连接库文件,将Test1.dll 和a.h 拷到Matlab 工作目录下。

d.在Matlab 命令行下,调用Test.dll:>>loadlibrary(‘Test1’,’a.h’); >>x=7;

>>y=8; >>calllib(‘Test1’,‘add’,x,y); Ans=15 >>unloadlibrary(‘Test1’).

调用DLL 动态连接库的方法,为Matlab 重用工程实践中积累的大量实用C/C++代码提供了一种简洁方便的方法。与调用MEX 文件相比,该方法更加简便实用。

3 C/C++调用Matlab

在工程实践中,C/C++调用Matlab 的方法主要有调用Matlab 计算引擎、包含m 文件转 换的C/C++文件,以及调用m 文件生成的DLL 文件。

3.1 利用Matlab 计算引擎

Matlab 的引擎库为用户提供了一些接口函数,利用这些接口函数,用户在自己的程序 中以计算引擎方式调用Matlab 文件。该方法采用客户机/服务器的方式,利用Matlab 引擎 将Matlab 和C/C++联系起来。在实际应用中,C/C++程序为客户机,Matlab 作为本地服务器。

C/C++程序向Matlab 计算引擎传递命令和数据信息,并从Matlab 计算引擎接收数据信息[2]。

Matlab 提供了以下几个C 语言计算引擎访问函数供用户使用[8]:engOpen,engClose, engGetVariable,engPutVariable,engEvalString,engOutputBuffer,engOpenSingleUse, engGetVisible,engSetVisible。

下面以C 语言编写的、调用Matlab 引擎计算方程x3 ?2x+5=0根的源程序example2.c 为 例,说明C/C++调用Matlab 计算引擎编程的原理和步骤:

#include windows.h> #include stdlib.h>

#include stdio.h> #include engine.h

int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,

LPSTR lpszCmdLine, int nCmdShow)

{ Engine *ep; mxArray *P=NULL,*r=NULL;

char buffer[301]; double poly[4]={1,0,-2,5};

if (!(ep=engOpen(NULL)))

{fprintf(stderr,nCan't start MATLAB enginen); return EXIT_FAILURE;}

P=mxCreateDoubleMatrix(1,4,mxREAL); mxSetClassName(P,p);

memcpy((char *)mxGetPr(P),(char *)poly, 4*sizeof(double));

engPutVariable(ep,P); engOutputBuffer(ep,buffer,300);

engEvalString(ep,disp(['多项式',poly2str(p,'x'),'的根']),r=roots(p));

MESSageBox(NULL,buffer,example2 展示MATLAB 引擎的应用,MB_OK);

engClose(ep); mxDestroyArray(P); return EXIT_SUCCESS; }



关键词: Matlab 混合编程 接口

评论


相关推荐

技术专区

关闭