【环境】VS2013和MATLAB相互调用混合编程
Visual Studio和MATLAB混合编程,有两种方法:
1 MATLAB调用C程序;
2 VS调用MATLAB(目前见到的都是VS,其他编译器如codeblocks,或不提供这项功能);
前一种是用MATLAB的mex命令调用VS或其他编译器,将以一定方式编写出的C文件编译成.mexw32(针对win32)或者.mexw64(针对win64),然后MATLAB就可以用调用动态链接库的方式,调用C程序。这一过程中,只需要在安装好编译器的前提下,执行:
mex -setup
和
mbuild -setup
并按照提示按部就班地帮助MATLAB找到C编译器就可以了。遇到MATLAB找不到Visual Stdio的情况时,可按照官方网站提供的方法,例如如果MATLAB找不到已安装的Visual Studio 2013,则在
http://www.mathworks.com/matlabcentral/fileexchange/44408-matlab-mex-support-for-visual-studio-2013--and-mbuild-
下载官方提供的文件,按照README的要求将文件复制到指定目录下即可。
README:
The files
* msvc120engmatopts.bat
* msvc120opts.bat
* msvc120opts.stp
should be copied to C:\Program Files\MATLAB\R2013a\bin\win64\mexopts . The files
* msvc120compp.bat
* msvc120compp.stp
should be copied to C:\Program Files\MATLAB\R2013a\bin\win64\mbuildopts .
另一种是反过来,由VS去调用MATLAB,因为归根结底,许多底层的代码都依赖于C/C++语言,如果要使用MATLAB进行实时的数据处理,那么必然是使用C/C++(从操作系统内核、套接字,或者设备)获取数据,再调用MATLAB进行处理。切入正题:
1 首先正确地安装好环境,如下是我使用的环境:
x86
Windows 7
VS2013
MATLAB R2010a(安装目录为D:\MATLAB\R2010a)。
2 下面是VS路径的包含:
右键项目—属性—VC++目录
—包含目录,添加D:\MATLAB\R2010a\extern\include;(注意分号)
—库目录,添加D:\MATLAB\R2010a\extern\lib\win32\microsoft;
—C/C++(—常规),添加附加包含目录D:\MATLAB\R2010a\extern\include\;
—链接器
—常规,添加附加库目录D:\MATLAB\R2010a\extern\lib\win32\microsoft;
—输入,添加附加依赖项:libeng.lib;libmat.lib;libmex.lib;libmx.lib;mclmcrrt.lib;mclmcr.lib;
3 系统环境变量:PATH里添加D:\MatLab\R2010a\bin\win32; 帮助VS找到MATLAB的提供的动态链接库。
4 注册MATLAB服务器:cmd,在D:\MatLab\R2010a\bin目录下运行
matlab \regserver
大概是开启MATLAB Server模式,接收VS的调用请求吧。
5 下面写C/C++程序:
添加头文件以及动态链接库:
#include "engine.h" #pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "libeng.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
打开引擎(引擎用来调用MATLAB):
Engine* pEng = NULL;
if (!(pEng = engOpen(NULL)))
{
printf("Open matlab enging fail!");
getchar();
return -;
}
引擎打开函数openEng调用完毕后一定要检查是否打开成功(类似云malloc函数,申请完内存一定要检查是否申请成功),因为就算pEng==NULL,在函数engEvalString执行中也不会抛出异常的,只会导致engGetVariable执行失败,当然咯,因为根本没执行嘛,哪来的variable?
然后可以调用啦,一切的matlab命令都可以通过下面这个函数传入MATLAB执行,类似于Linux的系统调用exec("...")和windows的system("..."):
engEvalString(pEng, "x=0:0.01:pi); y=sin(x); plot(x, y)");
如果要得到MATLAB的返回结果:
engEvalString(pEng, "x=0:0.02:3.14; y=sin(x); plot(x, y)");
mxArray *x= engGetVariable(pEng, "x");
mxArray *y= engGetVariable(pEng, "y");
double * _x = mxGetPr(x);
double * _x = mxGetPr(y);
//此时_x为x数组,_y为y数组
由于MATLAB里面,数据都将看成矩阵来处理,因此返回结果也是以Array的方式返回,如果是单个值,就是array[0],否则为array[0..n-1],如何得到n呢?还是用函数engGetVariable咯,可以先执行n=length(x),再将n传回。
执行结束后,记得关闭引擎:
if(pEng)
engClose(pEng);
注意一旦关闭,就不能再使用pEng了,否则会抛出异常。并且,在关闭引擎后,原本在执行过程中得到的figures也会关闭。在我的课题里面,引擎是在程序开始时打开,程序最终退出时才关闭。
6 如果在编译期间出现“找不到XXX.lib”的情况,检查路径是否正确添加,不然就直接复制lib文件到system32吧。。。
7 如果编译链接通过,运行起来还是有异常,检查matlab server是否有注册成功:运行matlab /regserver,再试一试。
8 因为调用MATLAB执行的命令是以字符串形式传入的,千万注意字符串里面的特殊符号、空格。特殊符号前面需要加上反斜杆,若有空格,依据MATLAB的语法,应使用单引号。例如:
engEvalString(pEng,"cd \'E:\\Desktop\\Alilce and Bob\' ");
9 如果遇到ERROR LNK2019,如:
错误 error LNK2019: 无法解析的外部符号 _mxGetPr,该符号在函数 "void __cdecl dataProcessing(struct engine *)" (?dataProcessing@@YAXPAUengine@@@Z) 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab
错误 error LNK2019: 无法解析的外部符号 _mxDestroyArray,该符号在函数 "void __cdecl dataProcessing(struct engine *)" (?dataProcessing@@YAXPAUengine@@@Z) 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab
错误 error LNK2019: 无法解析的外部符号 _engEvalString,该符号在函数 "void __cdecl dataProcessing(struct engine *)" (?dataProcessing@@YAXPAUengine@@@Z) 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab
错误 error LNK2019: 无法解析的外部符号 _engOpen,该符号在函数 _main 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab
错误 error LNK2019: 无法解析的外部符号 _engClose,该符号在函数 _main 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab
错误 error LNK2019: 无法解析的外部符号 _engGetVariable,该符号在函数 "void __cdecl dataProcessing(struct engine *)" (?dataProcessing@@YAXPAUengine@@@Z) 中被引用 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\matlab\main.obj matlab
错误 error LNK1120: 个无法解析的外部命令 C:\Users\OurEDA\Desktop\Ahotspot\Models\RSS CSI Models\Debug\matlab.exe matlab
检查MATLAB和VS是否运行在同一平台上,如果MATLAB是x64,那么配置管理器中一定要选中x64,否则选Win32:
右键项目——在配置管理器的下拉菜单里选中正确的平台,然后按照上面所述的过程重新配置路径。

以上~
【环境】VS2013和MATLAB相互调用混合编程的更多相关文章
- matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)
matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...
- Matlab与C++混合编程 1--在C++中调用自己写的matlab函数
在Visual Studio中使用C++中调用MATLAB程序 在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目 ...
- matlab与vs混合编程/matlab移植
前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...
- 算法库:Matlab与C++混合编程
算法库:Matlab与C++混合编程 最近做光流算法预演过程中,下载的源码中涉及到了Matlab和C++的混合编程.在同事Matlab2014的环境下,程序到是一下就运行通过了.但在我这Matlab2 ...
- 【目录】Matlab和C#混合编程文章目录
本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.Matlab和C#混合编程文章目录 9.接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点 8.国内第一 ...
- Matlab与.NET混合编程解决人脸识别问题
原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...
- Matlab与C++混合编程(依赖OpenCV)
Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...
- C# Matlab 相互调用
转自禾木junjie原文C# Matlab 相互调用 测试环境 VisualStudio2013 / .net4.0 Matlab2015b 高版本的matlab对外接其它语言做得很方便了,并不需要一 ...
- [转] Matlab与C++混合编程(依赖OpenCV)
作者 zouxy09@qq.com,原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的M ...
随机推荐
- Cookie禁用了,Session还能用吗?
Cookie与Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案.Cookie分为两种,一种可以叫做session ...
- 如何解决谷歌浏览器下jquery无法获取图片的尺寸
代码如下: $(document).ready(function(){ var img_h=$img.height(); var img_w=$img.width(); }) 以上代码在IE和火狐中没 ...
- C# [STAThread]
转载:http://www.cnblogs.com/netdazhi/articles/1189549.html 每个Thread都有一个关于ApartmentState的属性,可以把它设置为:STA ...
- zabbix2.4 安装配置
首先从www.zabbix.com下载rpm包: 接下来我要配置一台zabbix server,自己监控自己即使服务端又是客户端,zabbix web gui和zabbix数据库都放在同一台主机上,除 ...
- ThinkPHP之中的事务回滚
小李子 获取thinkphp之中执行的SQL: 1.用调试模式的追踪trace功能: 2.代码: $user_type=D('user_type'); $datass=array('school_id ...
- 发短信的主要代码(SmsManger)
SmsManager smsManager=SmsManager.getDefault(); smsManager.sendTextMessage(number,null,sms, null,null ...
- Android中style的使用
摘自搜搜问问. <item name="#1">#2</item> 1.item 的name属性#1可以为所有系统所带组件的属性,#2为此属性的值如andr ...
- 【Delphi】从内存(MemoryStream)使用WMP(WindowsMediaPlayer)控件播放视频音频(Play Video with WMP from MemoryStream)
关键字: MemoryStream.WMP.WindowsMediaPlayer.Play .Load. Delphi.C++.C#.ActiveX控件 作 者: CaiBirdy 问 题:正常使 ...
- python去掉空行
#用strip(),split()两个方法都可以判断空行 infile=open('/.../','r') outfile=open('/.../','w') for li in infile.rea ...
- XAML(3) - 附带属性
WPF元素也可以从父元素中获得特性.例如,如果Button元素为了Canvas元素中,按钮的Top和Lef属性把父元素的名称作为前缀.这种属性成为附带属性: <Canvas> <Bu ...