Matlab与C++混合编程

来源:互联网 发布:波士顿矩阵法案例 编辑:程序博客网 时间:2024/05/22 08:13

关于Matlab与C++混合编程,网上资料不多,我这里根据自己的研究,写一下这个过程吧,能力有限,见谅哈

奋斗Malab设置

我们要对Matlab进行设置,因为需要把Matlab程序生成dll链接库让C++调用,所以需要为Matlab设置一个C++编译器。

MatlabCommand Window中输入mbuild -setup,按Enter键,Matlab会问你是否要定位已经安装了的编译器。

Welcome to mbuild -setup.  This utility will help you set up  

a default compiler.  For a list of supported compilers, see  

http://www.mathworks.com/support/compilers/R2013a/win32.html 

Please choose your compiler for building shared libraries or COM components: 

Would you like mbuild to locate installed compilers [y]/n?

y,再按Enter建,Matlab会给你列出可供选择的编译器

Select a compiler: 

[1] Microsoft Visual C++ 2010 in C:\Program Files\Microsoft Visual Studio 10.0 

[0] None 

Compiler:1

因为我已经安装了Visual Studio 2010,所以这里才会出现它,我们指定Visual Studio 2010作为MatlabC++编译器。

Please verify your choices: 

Compiler: Microsoft Visual C++ 2010  

Location: C:\Program Files\Microsoft Visual Studio 10.0 

Are these correct [y]/n? y

************************************************************************

  Warning: Applications/components generated using Microsoft Visual C++      

           2010 require that the Microsoft Visual Studio 2010 run-time       

           libraries be available on the computer used for deployment.       

           To redistribute your applications/components, be sure that the    

           deployment machine has these run-time libraries.                  

************************************************************************

Trying to update options file: 

C:\Users\Administrator\AppData\Roaming\MathWorks\MATLAB\R2013a\compopts.bat 

From template:D:\MATLAB\bin\win32\mbuildopts\msvc100compp.bat 

Done . . . 

到这里就设置好了。需要注意的是,必须先安装Visual Studio 2010,再设置MatlabC++编译器,不然在compiler里会找不到它。

把写好的M文件编译成C/C++程序可调用的链接库。

比如现在建一个M文件PlotWave.m,内容为:

function PlotWave(FilePath)x =wavread(FilePath);plot(x);

保存后再Command Window中输入:

mcc -W cpplib:PlotWave -T link:lib PlotWave.m -C

执行之后就会生成一下文件:


这里讲解一下mcc指令跟它的参数的意思。

新版的Matlab软件包中提供了C/C++的数学和图形库,通过mcc编译器可以将Matlab中编写M文件转换成以C/C++代码的文件,而且可以将M文件生成dll

mcc参数说明:

-W cpplib:PlotWave

生成C++链接库,生成的文件名为PlotWave

-T link:lib

生成库文件

PlotWave.m

被编译的文件名

-C

生成ctf文件

===========================================================华丽丽的分隔线===========================================================

奋斗Visual Studio设置

将上面上次的h文件、dll文件、lib文件和ctf文件拷贝到Visual Studio的工程目录下,因为我们要在工程里使用dll库中的接口函数。

生气C/C++常规设置

项目->属性->C/C++->常规->附加包含目录

添加..\MATLAB\extern\include目录,具体路径根据你的Matlab安装目录而定。

生气链接器设置

项目->属性->链接器->常规->附加库目录

添加..\MATLAB\extern\lib\win32\microsoft目录,具体路径根据你的Matlab安装目录而定。


项目->属性->链接器->输入->附加依赖项

首先添加mclmcrrt.lib,然后再添加我们刚刚用Matlab生产的lib文件,如PlotWave.lib,依照上面的方法,把需要的M文件都生产链接库,并包含进我们的工程中来,最后依赖项如下:


生气链接库接口函数

在解决方案里将链接库对应的h文件包含进来,并在使用了链接库接口函数的cpp文件中include这个头文件。这样就可以使用其中的接口函数了。

在每个生成的h文件里我们都会看到XXXInitializeXXXTerminate两个接口。它们分别是对链接库进行初始化跟终止。在调用链接库的功能函数之前必须先调用XXXInitialize进行初始化,否则会报错;在主程序要退出时,必须先调用XXXTerminate对链接库的使用进行终止。

PlotWave.h为例:

初始化接口

extern LIB_PlotWave_C_API 

bool MW_CALL_CONV PlotWaveInitialize(void);

终止接口

extern LIB_PlotWave_C_API 

void MW_CALL_CONV PlotWaveTerminate(void);

画波形接口

extern LIB_PlotWave_CPP_API 

void MW_CALL_CONV PlotWave(const mwArray& FilePath);

我们在C/C++程序中调用PlotWave接口函数就可以实现像在Matlab中直接运行M文件的效果了。

注意,这里有一个特殊的C++数据类型:mwArray

mxArrayMatlab C函数库的结构体,而mwArrayMatlab C++ 函数库中对mxArray的包装类。使用方法如下:

例1 获取测试语音的绝对路径并作为接口函数的输入参数。

char cDirectory[100];getcwd(cDirectory,100); //获得工作路径strcat(cDirectory,"/TestSound.wav");//活动TestSoud.wav的绝对路径mwArray mwFilePath(cDirectory);//声明mwArray对象并初始化PlotWave(mwFilePath); //调用接口函数

端点检测输出端点数。

extern LIB_PointDetection_CPP_API void MW_CALL_CONV PointDetection(int nargout, mwArray& TickCount, const mwArray& FilePath);

nargout

输入参数个数

TickCount

输出参数,表示端点个数

FilePath

输入文件的绝对路径

调用过程如下:

mwArray mwTickCount(1,1,mxUINT32_CLASS);//声明mwArray对象,类型为uint32PointDetection(1,mwTickCount,mwFilePath); //调用接口函数int dwTickCount=0;mwTickCount.GetData(&dwTickCount,1); //mwArray转int

其中GetData第二个参数是指取数列的第几个值,因为输出为端点个数,只有一个值,所以刚好就是第一个值,所以GetData第二个参数为1

得意总结:

首先用Matlab把算法写成M文件,然后通过mcc指令生成C/C++可以使用的链接库文件,接着在C/C++工程项目中包含并使用这些链接库,从而实现MatlabVisual Studio的混合使用。




0 0