Matlab与C++混合编程
来源:互联网 发布:波士顿矩阵法案例 编辑:程序博客网 时间:2024/05/22 08:13
关于Matlab与C++混合编程,网上资料不多,我这里根据自己的研究,写一下这个过程吧,能力有限,见谅哈
Malab设置
我们要对Matlab进行设置,因为需要把Matlab程序生成dll链接库让C++调用,所以需要为Matlab设置一个C++编译器。
在Matlab的Command 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作为Matlab的C++编译器。
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,再设置Matlab的C++编译器,不然在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文件里我们都会看到XXXInitialize跟XXXTerminate两个接口。它们分别是对链接库进行初始化跟终止。在调用链接库的功能函数之前必须先调用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。
mxArray是Matlab C函数库的结构体,而mwArray是Matlab C++ 函数库中对mxArray的包装类。使用方法如下:
例1 获取测试语音的绝对路径并作为接口函数的输入参数。
char cDirectory[100];getcwd(cDirectory,100); //获得工作路径strcat(cDirectory,"/TestSound.wav");//活动TestSoud.wav的绝对路径mwArray mwFilePath(cDirectory);//声明mwArray对象并初始化PlotWave(mwFilePath); //调用接口函数
例2 端点检测输出端点数。
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++工程项目中包含并使用这些链接库,从而实现Matlab和Visual Studio的混合使用。
- matlab与C混合编程
- matlab与c混合编程
- matlab与C混合编程
- MATLAB与C混合编程
- matlab与c混合编程
- matlab与c(c++)混合编程
- matlab与C++/C 混合编程
- C/C++与Matlab engine 混合编程
- C/C++与Matlab engine 混合编程
- Matlab与C/C++混合编程
- Matlab与C/C++混合编程
- C/C++与Matlab混合编程初探
- C/C++与Matlab混合编程初探
- C/C++与Matlab混合编程初探
- matlab与c/c++混合编程
- C/C++与Matlab混合编程初探
- C/C++与Matlab混合编程初探
- C/C++与Matlab混合编程
- 如何判断Socket连接失效
- genymotion 使用技巧
- SublimeText3: ImportError: No module named ‘urllib2′
- 在一条语句中count出不同的条件
- Android Fragment小结
- Matlab与C++混合编程
- cocos studio试用体验
- JS操作GridView,JS获取table的td中的值跟控件
- 用qsort对字符串数组排序需要注意的几个问题
- [leetcode][math] Basic Calculator
- matplotlib内坐标的设置及使用
- 处理器,操作系统,程序的位数,指针的长度
- 在Spring MVC中,事务可以加在Controller层
- Android 性能分析案例