VC++与Matlab混合编程之一:调用Matlab引擎
VC与Matlab混合编程
VC与Matlab混合编程本⽂主要介绍VC与Matlab混合编程的两种⽅法,并详细介绍了VC向Matlab传递复杂数据:结构体的⽅法,有详细代码说明。
Matlab 主要⾯对科学计算、可视化以及交互式程序设计的⾼科技计算环境,但由于Matlab开发平台上开发的程序不能脱离Matlab运⾏环境,因⽽在处理⼀些实际应⽤问题时显得灵活性不⾜,⽽VC++则在⼀定程度上能够弥补这⼀漏洞,因此,将⼆者结合共⽤,各献其长,可以为科研⼯作和⼯程开发提供更为强⼤的技术⽀持。
Matlab作为控制系统设计的⼀种通⽤⼯具,它可以很⽅便的和VC进⾏连接。
⼀般⽽⾔,Matlab与VC混合编程的实现⽅法有很多种,这⾥主要介绍以下两种:1. VC调⽤Matlab Engine的⽅式:Matlab Engine是⼀组Matlab提供的接⼝函数,⽀持C/C++语⾔,Matlab Engine采⽤C/S(客户机/服务器)模式,Matlab作为后台服务器,⽽C/C++程序作为前台客户机,向Matlab Engine传递执⾏命令和数据信息,从Matlab Engine接收执⾏结果。
⽤户可以在前台应⽤程序中调⽤这些接⼝函数,实现对Matlab Engine的控制。
采⽤这种⽅法⼏乎能利⽤Matlab全部功能,但是需要在机器上安装Matlab软件,缺点是执⾏效率较低。
下⾯简单介绍下这种⽅式的实现步骤:1.1 API接⼝介绍先来介绍⼀组Matlab提供的引擎API接⼝:(仅作简单功能介绍,详细参数说明请参考Matlab帮助)Engine* engOpen(const char* startcmd)启动Matlab引擎int engClose(Engine* ep) 关闭Matlab引擎int engEvalString(Engine* ep, const char* string)执⾏Matlab表达式mxArray* engGetArray(Engine* ep, const char* name)获取⼀个变量数组的值int engPutArray(engine* ep, const mxArray* mp)设置⼀个变量数组的值int engPutVariable(Engine *ep, const char *name, const mxArray *pm)同上mxArray *engGetVariable(Engine *ep, const char *name)获取⼀个变量int engOutputBuffer(Engine* eP,char* p,int n)获取输出字符串1.2 VC环境配置要想在VC集成环境下调⽤Matlab引擎实现VC和Matlab的混合编程,⼀般需要经过以下⼏个必要的步骤:(以下以Matlab2008a和VS2005版本为例)(1)添加include路径:将“\extern\include”(在Matlab的安装路径下)路劲添加到VC编译器的include下(2)添加lib路径:将“\extern \lib\win32\microsoft” (在Matlab的安装路径下) 路径添加到VC编译器的lib下(3)加载lib:需要加载⾄少libmx.lib、libmat.lib、libeng.lib三个库(4)include头⽂件:在要使⽤ engine 函数的地⽅包含engine.h头⽂件1.3 引擎调⽤接下来就可以在VC中调⽤Matlab引擎了,简单的⽰例代码如下:#include "engine.h"#pragma comment(lib, "libeng.lib")#pragma comment(lib, "libmx.lib")#pragma comment(lib, "libmat.lib")void TestDeno(){Engine* pEng = NULL;if (!(pEng = engOpen(NULL))){printf("Open matlab enging fail!");return;}//call Engine plot A*sin(t)+B A=2 B=1mxArray *A = NULL;double init = 2;A = mxCreateDoubleMatrix(1, 1, mxREAL);memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));engPutVariable(pEng, "A", A);init = 1;memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));engPutVariable(pEng, "B", A);mxDestroyArray(A);Sleep(3*60*1000);engEvalString(pEng, "t=0:0.2:7;plot(t,A*sin(t)+B);");if(NULL != pEng){engClose(pEng);}}⽰例代码通过VC调⽤Matlab引擎,绘制正弦曲线,相对简单,就不再详细解释,效图如下:2. VC调⽤Matlab DLL的⽅式DLL是⼀个可执⾏的⼆进制⽂件。
C语言环境中调用Matlab程序指南
C语言环境中调用Matlab程序指南甄梓宁znzhen@Matlab在计算方面功能强大、编写简单,但是要运行Matlab程序必须装有Matlab并且用户界面也不够完善,因此除了计算的其他部分采用C等更规范完备的语言进行编写是较好的选择。
本文就对如何在C程序中调用Matlab程序作说明。
在C程序中调用Matlab程序有两大类方法。
第一种是调用Matlab引擎,第二种是将m文件打包成dll文件在C语言环境下调用。
前者虽然易于实现,可以实时监控程序的运行,但是独立性差,需要安装完整版Matlab,且每次调用都会启动MATLAB.exe进程;后者则实现复杂,调试麻烦,但只需安装MCR(Matlab Component Runtime),耗费资源较少。
关于MCR,请见第四章的说明。
至于两种方法需要在C环境中如何配置请见第五章。
而反过来若要在Matlab下调用C程序则一般使用Matlab自带的mex工具,在此不作介绍。
一、调用Matlab引擎调用Matlab引擎可以在WIN32、MFC中使用,它的原理实际上相当于打开一个精简版的Matlab然后往里面输命令。
下面是调用Matlab中的加法程序add.m的例子。
先在Matlab的work目录下创建add.m文件并编写程序如下:function s = add (a, b)s = a+b;在C程序中,首先打开精简版的Matlab:(所需头文件,引用库等见第五章)Engine *ep = engOpen (NULL);编译运行后,会自动打开一个命令行监控窗口,输入pwd就可以看到当前的工作目录,于是需要先将工作目录转换至存放add.m的目录:engEvalString (ep, ”cd ..\\..\\work”);engEvalString是往Matlab里输命令的函数,显然我们的目标是成功运行:engEvalString (ep, ”s=add(a,b)”);当然,目前Matlab中并没有a和b两个变量,因此需要在C中初始化这两个变量并转换成Matlab基本变量类型mxArray,才能将它们输入到Matlab中。
VC++调用Matlab引擎(engine)配置方法
如何在C/C++语言里调用Matlab引擎(engine)——(上篇)windows下的Visual C++平台Windows下调用Matlab引擎要做好以下三点设置(1)设置头文件目录(2)设置库文件目录,并添加链接库输入项libeng.lib和libmx.lib(3)设置环境变量以下以Visual Studio 2008为例来说明如何设置这三点:1、添加头文件目录依次选择:“工具”->“选项”,调出对话框后再在对话框左边“选择项目和解决方案”->“VC++目录”然后在右边选择“显示以下内容的目录”下的选框选择“包含文件”,再在目录列表的最下边空行处选中添加:matlab安装目录下的\extern\include路径比如我的是:C:\Program Files\MATLAB\R2011a\extern\include如果现在生成项目,链接将不会通过,比如可能会出现:1>engwindemo.obj : error LNK2019: 无法解析的外部符号_mxDestroyArray,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_mxGetPi,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engClose,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engGetVariable,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engOutputBuffer,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engEvalString,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engPutVariable,该符号在函数_WinMain@16 中被引用等链接错误;这就需要设置下面的库文件目录2、添加库文件目录在刚才调出来的对话框中,设置库目录:选择“显示以下内容的目录”下的选框选择“库文件”添加matlab目录下的C:\Program Files\MATLAB\R2011a\extern\lib\win32\microsoft注意:如果是项目要生成的是64位程序那么应该选择的是C:\Program Files\MATLAB\R2011a\extern\lib\win64\microsoft点击确定退出对话框,然后给项目添加链接库输入项:在解决方案资源管理器里选择对应的项目单机右键选择最下面的“属性”弹出属性对话框,在右边依次选择“配置属性”->“链接器”->“输入”,然后在右边“附加依赖项”那一项加上libeng.lib libmx.liblibmat.lib单击确定退出注意:(1)不要删除原有的依赖项(2)依赖项之间用空格隔开做到这一步时生成时就没问题出现了,但是运行程序时会出现“因为计算机中丢失libeng.dll”等类似问题第(3)步就解决这个问题的。
Visual-C#与Matlab混合编程示例(含代码)
Visual C# 与Matlab 混合编程由于Visual C# 与Matlab 混合编程的资料并不多,本文通过一个实例来阐述Visual C# 与Matlab 混合编程的方法。
一、混合编程的 4 种方式1. 通过从Matlab的*m文件中生成C语言版本的DLL1) 在Matlab中写好m文件;2) 使用Matlab的编译器,编译为C#能识别的DLL文件;3) 建立C#工程,在工程中引用上一步生成的文件;2. C#调用Matlab工作区计算并返回结果主要使用engOpen, engClose, engPutVariable, engEvalString, engGetVariable 函数进行操作。
大致过程如下:MatlabCSharp.engPutVariable(ep, "ml_a", mx_a);MatlabCSharp.engPutVariable(ep, "ml_b", mx_b);MatlabCSharp.engEvalString( ep, "ml_c = ml_a + ml_b ;" ); mx_c = MatlabCSharp.engGetVariable(ep, "ml_c" );3. 使用Matlab DeployTool 生成COM 组件1) 单击菜单New Deployment Project -> MATLAB Builder NE -> Generic COM Component2) 添加相应的M 文件3) 保存,编译4) 新建C#工程,引用生成的DLL文件。
4. 使用Matlab DeployTool 生成.Net 组件1) 单击菜单New Deployment Project -> MATLAB Builder NE -> .Net Component2) 添加相应的M 文件3) 保存,编译4) 新建C# 工程,引用生成的DLL 文件。
VisualStudio与Matlab实现混合编程
VisualStudio与Matlab实现混合编程环境:Win10vs2010Matlab2015⾥⾯有很多选做的内容,其中2、3必做1.Matlab环境设置:(选做)我没有做这步,因为打mbuild -setup指令不识别,缺少SDK,但是可以正常调⽤Matlab,这步是其他⽅式调⽤Matlab中的⼀步,使⽤Matlab⽣成DLL⽂件,VS引⽤要建⽴独⽴运⾏的C应⽤程序,系统中需要安装Matlab、Matlab编译器、C/C++编译器以及Matlab C/C++数学库函数和图形库函数。
Matlab编译器使⽤mbuild命令可以直接将C/C++源代码编译为独⽴运⾏程序,在这些源代码中可以使⽤Matlab提供的接⼝来调⽤Matlab数学库函数。
虽然⽣成的可执⾏程序可以脱离Matlab环境运⾏,但是它需要Matlab C/C++数学库⽂件或者图形库⽂件的⽀持才能运⾏。
但如果C/C++源代码完全是按传统C/C++源代码语法规则编写,没有包含Matlab数学库和图形库的调⽤,则不仅可以独⽴与Matlab环境,也不需要那两个库函数的⽀持。
在 Matlab 的Command Window 下输⼊命令。
mbuild – setup操作过程如下图:然后输⼊命令mex – setup以类似的⽅法配置编译器。
Matlab 的配置完成。
2.VS环境设置(必做)(1)设置Include 和Library ⽬录项⽬右键->属性->VC++⽬录->包含⽬录:添加<MATLAB>\R2010b\extern\include\win64 我的是:D:\RUANJIAN\Matlab\extern\include\win64<MATLAB>\R2010b\extern\include\ 我的是:D:\RUANJIAN\Matlab\extern\include项⽬右键->属性->VC++⽬录->库⽬录:添加<MATLAB>\R2010b\extern\lib\win32\microsoft 我的是:D:\RUANJIAN\Matlab\extern\lib\win64\microsoft<MATLAB>\R2010b\extern\lib\win64\microsoft截图::(2)设置⼯程⽬录: ( 我并没有设置)项⽬右键->属性->C/C++->常规->附件包含⽬录:添加<MATLAB>\R2010b\extern\include\win64<MATLAB>\R2010b\extern\include\项⽬右键->属性->链接器->常规:添加<MATLAB>\R2010b\extern\lib\win32\microsoft<MATLAB>\R2010b\extern\lib\win64\microsoft项⽬右键->属性->链接器->输⼊->附件依赖性:添加 (必做)libeng.liblibmat.liblibmex.liblibmx.lib 注:1.lib⽂件包含在<MATLAB>\R2010b\extern\lib\win64\microsoft,可根据需要增减 2.附件依赖性在VS2010前以空格隔开,在VS2010后使⽤;隔开。
使用VC调用matlab_engine编程
关于如何使用VC调用matlab engine编程刚开始学使用VC调用matlab engine编程的时候,遇到很多问题,就去百度找解决方法,但发现根本解决不了我的问题,因为网上大部分实例和步骤都是在matlab6.5和vc++6.0环境下完成的,但是现在我用的是matlab2010a,所以会出现很多环境配置的问题,写本文的目的是总结用我在用VC调用matlab engine编程过程中出现的问题和解决办法。
Matlab Engine 采用Client/Server的方式,通过ActivcX通道和Matlab接口来实现在VC编程环境中直接调用matlab中的指令。
调用使用的函数是:engEvalSting。
下面是自己的实践过程:如果是第一次使用,则要设置一下Visual C++6.0 编程环境中的include 和lib的路径指向。
我的matlab2010安装在D盘目录D:\MATLAB 2010一、设置VC相关属性。
(1)Visual C++6.0 编译环境的设置:通过菜单 Tools/ Options,打开Visual C++6.0设置属性页,进入 Directorie页面,在 Show Directories for 下拉列表中选择Include Files,添加路径:D:\MATLAB 2010\extern\include (这是我电脑中Matlab的安装路径);再选择下拉列表中的 Library Files,添加路径:D:\MATLAB 2010\extern\lib\win32\microsoft(我电脑中Matlab 的安装路径,但是在我查看资料的时候看到很多是D:\MATLAB2010\extern\lib\win32\microsoft\msvc60这个路径,但是我用的是MatlabR2010a,msvc60是matlab6.5老版本才有的,10.0版本没有这个文件,所以我们把路径设到D:\MATLAB 2010\extern\lib\win32\microsoft 就可以了)。
MATLAB与VC混合编程配置设置
MATLAB与VC混合编程相关配置的设置MATLAB与VC的混合编程中,需要对电脑的“环境变量”和VC的“环境配置”进行设置,然后才可以进行程序的调用。
(1)电脑中“环境变量”的设置:对于win10系统控制面板→系统→高级系统设置→环境变量→系统变量→path中添加D:\softwares\MATLAB\ bin\win64,该路径是MATLAB中dll文件的路径,在path 中添加该路径的目的是让VC在运营时能够读取dll文件。
否则VC在运行时可能会出现“计算机丢失**.dll文件”的情况。
对于win7系统的“环境变量”设置,同样是在path中进行的。
(2)VC的环境配置首先需要建立一个新项目,如MyAdd.cpp。
项目→MyAdd属性→VC++目录→包含目录→D:\softwares\MATLAB \extern\include;项目→MyAdd属性→VC++目录→库目录→D:\softwares\MATLAB\installation document\extern\lib\win64\microsoft。
C/C++→常规→附加包含目录→D:\softwares\MATLAB \extern\include;C/C++→常规→调试信息格式→程序数据库(/Zi);链接器→常规→启用增量链接→是(/INCREMENTAL);链接器→常规→附加库目录→D:\softwares\MATLAB\ extern\lib\win64\microsoft;链接器→输入→附加依赖项→libMyAdd.lib,mclmcrrt.lib,libmx.lib,libmat.lib,mclmcr.lib。
其中在输入时这些lib之间用回车换行。
上述步骤的工作界面如下所示:需要注意:在进行VC与MATLAB混合编程的过程中,用到的环境是32位还是64位,在这里需要是相同的编程环境才可以相互调用,如:上图中如果是x32,则需要点击“配置管理器”进行重新设置。
VC与Matlab混合编程的实现
1 引 言 、
MA L ec p t %\xeni ld \p a n
V 60是 Wi o s 面下 计算 机 专 业 人 士 进 C. n w 界 d
行 软 件开 发 时 的一种 强 大工 具 .在 图形 用 户界 面 需要 说 明的是 ,如果 Ma a t b的版本 不 同 , l 这 开发 方 面有 优势 . 码效 率 高 . 而在 科 学计 算 方 里看 到 的路 径就 会有 差 别 . 如 Ma a 6 代 然 例 t b 5和 Ma— l t 面能 力却 略 显不 足 。例如 , 当我们 采 用 V C作 为 开 l 7 a 4的路 径就 会有 所 差别 b 发 工 具 解 决 图 像处 理 和 模 式 识别 领域 的 问题 时 . Se .注 意 %Malb e trk bw n 2 \ . tp 3 t %\xenl \ i3 mi a i 经常需 要 进行 一 些复 杂 的矩 阵计算 例 如计 算 矩 阵 c0o \ v6 r fmsc 0中 的 * i 件 与 你 需 要 调 用 的 函 st .b文 1
12 7
福 建 电
脑
2 1 第 4期 0 2年
V C与 Ma a t b混合 编 程 的 实现 l
黄 红兵
( 建农 林 大 学计 算机 与信 息 学院 福 建 福 州 3 0 0 福 5 0 1)
Matlab与VC(MFC)混合编程(介绍Matcom与Matlab 引擎两种方式)文库
本文由wolf1sky贡献doc文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
Matlab 与 VC 混合编程 1:一、采用 Matcom1、目标1. 测试在 VC 中调用 MatrixC++库,生成矩阵并显示 2. 测试 VC 中调用.m 文件2、步骤2.1 目标 1<1>建立 VC 工程,添加库 v4501v.lib,有两种方法:?向工程中添加文件 v4501v.lib 在 Setting/link 中添加库 v4501v.lib(这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)二者选其一就可以了。
<2> 添加头文件 #include "matlib.h" (这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)建议:最好在工程中把文件 matlib.h 添加进来,方便查看函数详细说明 <3>现在就可以调用 Matrix中的C++函数了,例子如下:// Init matcom initM(MATCOM_VERSION); winaxes(AfxGetMainWnd()->GetSafeHwnd()); Mm a,b; a = (BR(1),2,3,semi,4,5,6,semi,7,8,9); a = transpose(a); b = (BR(1),2,3,semi,4,5,6,semi,7,8,9); m_1.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f %3f %3f \r\n",a.r(1,1),a.r(1,2),a.r(1,3),a.r(2,1),a.r(2,2),a.r(2,3),a.r(3,1),a.r(3,2),a. r(3,3));//m_1 是一个 CEdit 控件 UpdateData(FALSE); exitM();2.2 目标 2<1>首先用 Matlab 调试成功以下两个有依赖关系的.m 文件文件 1:equation.m function y = equation(a,b) y = a * b; 文件 2:CallE.m % function name function [o1,o2] = CallE(x) if (nargin ~= 1) error('arguments must be inputed!'); endif (x == 1) a = reshape(1:9,3,3); elseif (x == 2) a = reshape(11:19,3,3); else error('input error'); end b = magic(3); o1 = equation(a,b); o2 = o1 + 1; <2>将以上两个文件放在同一个目录下,启动 MatCom 编译运行 CallE.m, >> CallE(2) 则在同一目录下生成一个 DEBUG(或者是 Release,在 MatCom 的菜单项 Configuration 中选择)目录下可以找到相应的.cpp 及.h 文件,把它们全部拷贝到 VC 工程目录下,也可以自己建一个文件夹 <3>在 VC 项目中添加这些文件,并在头部添加相应.h 的引用,如下: #include "./matlib/equation.h" #include "./matlib/calle.h" <4>添加调用函数的代码,如下: Mm a,b,c; a = BR(2); 表示输入参数到输出参数的间隔,《MatrixLIB user's 详见calle(a,i_o,b,c); //i_o 是一个间隔符,Guide》m_2.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f \r\n",b.r(1,1),b.r(1,2),b.r(1,3),b.r(2,1),b.r(2,2),b.r(2,3),b.r(3,1),b.r(3,2),b. r(3,3)); %3f %3fUpdateData(FALSE);3、遇到的问题及解决方案<1>当在 VC 工程中添加由 Matcom 转换的 cpp 及 h 文件后,注:如果在编译中出现下列错误:fatal error C1010: unexpected end of file while looking for precompiled headerdirective 解决:进行下列设置:工程->设置-> C/C++ 选择 precompiled headers 选解决:择第一或第二项:自动选择预补偿页眉,如图:<2>使用Matcom 后,生成Debug 版没问题,而生成Release 时链接出错,nafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMT.lib(delete.obj) 解决:解决:将"Project 属性" -> "C/C++" -> "代码生成(codegeneration)" -> "运行时库(run-time library)" 项下修改应用程序的默认标准库版本,我修改成 Debug Multithreads 就可以了,原因是安装Matcom 时库为调试版<3>在其它机器上运行出错解决:解决:将 ago4501.dll v4501v.dll glu32.dll opengl32.dll 附带发布即可 <4>关闭程序后进程没有退出解决:解决:添加语句winaxes(m_hWnd);参考文献1、何东健等.《数字图像处理》.西安电子科技大学出版社.20032、邓科.浅析 VC 与matlab 接口编程(一). VC 知识库,41 期3、邓科.浅析 VC 与 matlab 接口编程(二). VC 知识库,42 期4、Matcom 参考手册Matlab 与 VC 混合编程 2:二、通过 Matlab 引擎与 VC 混合编程--飞狼编程宝典--明明知道选择你是一个错误,却为何那么地坚持这个错误……基于 Matlab 引擎的混合编程方式无法脱离 Matlab 环境,却为何还要使用它?根据本人的实践,对于一般应用,如矩阵运算,图像操作等,使用 Matcom 就已经足够,而且能够脱离 Matlab 那个巨大的环境而独立运行,但是,对于很多好用的 Matlab 工具箱,我们却无法直接在 VC 中调用。
VC中调用matlab配置方法
ATLAB提供了许多方法与VC程序的通信:MATLAB引擎(ENGINE)模式,采用了客户机/服务器(CLIENT/SERVER)的计算形式,通过MA TLAB应用程序接口(API)中有关函数,在VC 环境中调用MATLAB函数,但此种方法需要MATLAB环境后台支持,因此系统必须安装MATLAB;MA TLAB本身提供的MCC工具编译,编译m文件生成VC++或c语言,直接在VC中使用;MATLAB的MEX工具将m文件编译成DLL,供VC调用。
MATLAB现具有的MA TLAB Add—in(其包装了MCC、MEX)更方便了第二、三种方法的应用,现本系统的实现就是以第三种为基础的。
2.1 MA TLAB与VC实现互连为了在开发时实现对MA TLAB的具体功能的调用,应首先在操作系统中安装MATLAB工具软件,之后并运行此工具软件,依次执行“mex –setup;mbuild –setup;cd(prefdir); mccsavepath;”命令。
之后运行VC开发工具,从VC++菜单中依次打开“Tools->Customize->Add-ins and Macro Files”,选中MA TLAB Add—in宏,可以看到工具栏中多了一个。
现在VC就可以利用它来得到m文件所对应的c、c++文件。
2.2 开发工具VC运行环境设置开发时,须对VC的开发环境变量进行设置。
通过“Tools->Options->Directories”找到的“Directories”项中添加环境变量。
添加头文件和库文件搜索路径有(本计算机的文件搜索路径为):F:\MATLAB6P5\EXTERN\INCLUDEF:\MATLAB6P5\EXTERN\INCLUDE\CPP同时将MA TLAB的链接库添加到VC中。
从“Tools->Options->Directories”中“Show directories for:”下拉框里选择“Library files”,然后再在“Directories”项中添加环境变量。
Matlab中的多CPU并行计算:一种基于Matlab引擎的混合编程
Matlab中的多CPU并行计算:一种基于Matlab引擎的混合编程Matlab中的多CPU并行计算:一种基于Matlab引擎的混合编程实验室新购置了一台双核本本,就忍不住琢磨一下,好使得我那Matlab下的程序更有效率。
然而Google下来却收获甚微,有朋友提到可以使用Matlab的Distribution Computing Toolbox,但似乎是用于多台电脑联网时的情况,与我的要求相差甚远。
因此只好自己鼓捣一下,借此机会抛砖引玉,欢迎大家共同探讨。
方法思路非常清晰:使用C和Matlab混合编程的方法,在C中用线程启动Matlab引擎,如此就可以启动多个程序,充分发挥多核CPU的优势。
在这里给出一个简单的示例程序,其线程任务为通过随机数方法来计算pi(就是为了拖时间)。
示例一共由4个文件构成:ThreadDemo.cpp: 主程序compopts.bat: 编译配置文件Thread1.m: 计算pi的程序disp2.m: 辅助显示程序只需在Matlab环境下调用mbuild -f compopts.bat -v ThreadDemo.cpp命令即可生成可执行文件ThreadDemo.exe,再输入命令!ThreadDemo即可观察结果。
实验环境为在Matlab6.5, VC6.0。
Matlab7.0由于对混合编程的方式进行了较大改动,示例可以通过编译,但不能正常运行。
以下为运行结果:>> !ThreadDemo10:41:32 --> Time used: 27", 10:41:05 -- 10:41:3210:41:32 --> Task1: IterNum = 100000000, Result = 3.14196110:41:33 --> Time used: 27", 10:41:06 -- 10:41:3310:41:33 --> Task2: IterNum = 100000000, Result = 3.141961可以看到两个任务几乎同时启动,同时结束。
VC++中如何能调用matlab函数
Visual C++是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快。
但在科学计算方面函数库显得不够丰富、读取、显示数据图形不方便。
Matlab是一款将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,适合科学研究、工程设计等众多学科领域使用的一种简洁、高效的编程工具。
不过由于Matlab使用的是解释性语言,大大限制了它的执行速度和应用场合。
基于VC和Matlab混合编程是很多熟悉VC++编程而又需要进行科学计算、数据仿真的科研人员常用的一种方式,其中最简单也最直接的方法就是调用Matlab引擎。
本文以下部分将详细介绍通过VC++6.0调用Matlab6.5引擎来达到VC++与Matlab数据共享编程的方法。
1. 什么是Matlab引擎所谓Matlab引擎(engine),是指一组Matlab提供的接口函数,支持C/C++、Fortran等语言,通过这些接口函数,用户可以在其它编程环境中实现对Matlab 的控制。
可以主要功能有:★打开/关闭一个Matlab对话;★向Matlab环境发送命令字符串;★从Matlab环境中读取数据;★向Matlab环境中写入数据。
与其它各种接口相比,引擎所提供的Matlab功能支持是最全面的。
通过引擎方式,应用程序会打开一个新的Matlab进程,可以控制它完成任何计算和绘图操作。
对所有的数据结构提供100%的支持。
同时,引擎方式打开的Matlab进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过engine方式控制Matlab运行的流程,并可在其中输入任何Matlab命令。
实际上,通过引擎方式建立的对话,是将Matlab以ActiveX控件方式启动的。
在Matlab初次安装时,会自动执行一次:matlab /regserver将自己在系统的控件库中注册。
如果因为特殊原因,无法打开Matlab引擎,可以在Dos命令提示符后执行上述命令,重新注册。
c_调用matlab函数(混合编程)
第2部分实战练习(自己做的)2.1 c#调用matlab函数matlab版本2009b,c#版本vs2008.2.1.1 matlab函数编译成dll文件(1)首先编写一个函数的m文件,如MatrixOpera表示两个矩阵相加和相减。
%--------------------------------------------------------function [addRlt,minusRlt]=MatrixOpera(a,b)% 矩阵相加,相减[m1,n1]=size(a);[m2,n2]=size(b);if m1~=m2 || n1~=n2display('矩阵大小不相同')error('参数错误');endaddRlt=a+b;minusRlt=a-b;end%-----------------------------------------------------------两个输入参数,两个输出参数,并且都是矩阵形式(2)在matlab 命令窗口输入deploytool,弹出如下窗口或者点击matlab的主菜单desktop→deploy tool获得如下面图所示的窗口,然后在file→new→deployment project 中点击。
获得上图窗口,修改工程名称和文件后缀名(必须是,.Net Assembly格式)修改(3)新建了一个叫matPrj的工程(它相当于c#中的命名空间namespace);然后给它增加class或类(它就是c#中的类),点[add class]比如myMathClass;之后再给它添加方法(它就是函数了),点[add files],如下图所示。
本实例中给它添加了MatrixOpera等函数。
class方法(4)完了之后就可以编译了。
编译出来后需要一两分钟的时间。
编译(5)找到该工程存放的文件夹,从里面拷出matPrj.dll文件。
手把手教你用C#调用MATLAB函数
】【【转载】手把手教你用C#调用MATLAB函数编译环境:Microsoft Visual Studio2008版本9.0.21022.8RTM Framework版本 3.5已安装的版本:ProfessionalMicrosoft Visual Basic200891986-031-5000002-60050Microsoft Visual Basic2008Microsoft Visual C#200891986-031-5000002-60050Microsoft Visual C#2008Microsoft Visual C++200891986-031-5000002-60050Microsoft Visual C++2008Microsoft Visual Studio2008Tools for Office91986-031-5000002-60050Microsoft Visual Studio2008Tools for OfficeMicrosoft Visual Web Developer200891986-031-5000002-60050Microsoft Visual Web Developer2008Crystal Reports AAJ6G-K0MSA4K-680002ZCrystal Reports Basic for Visual Studio2008Matlab2008b首先需要做的工作是matlab编译器的设置,设置方法为:在Command window中输入mbuild-setup 显示如下>>mbuild-setupPlease choose your compiler for building standalone MATLAB applications:,Would you like mbuild to locate installed compilers[y]/n?n%选择nSelect a compiler:[1]Lcc-win32C2.4.1[2]Microsoft Visual C++6.0[3]Microsoft Visual C++.NET2003[4]Microsoft Visual C++2005[5]Microsoft Visual C++2005Express Edition[6]Microsoft Visual C++2008[0]NoneCompiler:6%选择6,其他编译器可以选相应的选项,我没有验证过The default location for Microsoft Visual C++2008compilers is C:\Program Files\Microsoft Visual Studio9.0,but that directory does not exist on this machine.Use C:\Program Files\Microsoft Visual Studio9.0anyway[y]/n?n%选择nPlease enter the location of your compiler:[C:\Program Files\Microsoft Visual Studio9.0] D:\Program Files\Microsoft Visual Studio9.0%选择您自己的当前安装路径Please verify your choices:Compiler:Microsoft Visual C++2008Location:D:\Program Files\Microsoft Visual Studio9.0Are these correct[y]/n?y%看上述信息,如果正确选择y**************************************************************************** Warning:Applications/components generated using Microsoft Visual Studio2008require that the Microsoft Visual Studio2008run-timelibraries be available on the computer used for deployment.To redistribute your applications/components,be sure that thedeployment machine has these run-time libraries.**************************************************************************** Trying to update options file:C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R2008b\compopts.batFrom template: D:\PROGRA~1\MATLAB\R2008b\bin\win32\mbuildopts\msvc90compp.batDone... %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%至次编译器设置完成%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%在matlab的Command window中输入:>>deploytoolMatlab产生deployment tool配置窗口单击新建按钮,新建工程------>选择MATLAB Builder NE选项卡----->选择.NET Component 并添加工程名eaqual(测试用名,其实工程名称就是你导入C#后的命名空间名称,Matlab会在当前工作目录中新建文件夹文件夹名既为equal)---->点击ADD File按钮将你需要编译的MATLAB函数添加进当前工程,我这里导入的是D:\Program Files\MATLAB\R2008b\toolbox\aero\aero\angle2quat.m文件---->点击build.deployment tool output窗口输出以下信息:Build output(2009-03-2815:32:55).[url=matlab:mcc%20-F%20%27E:%5CMATLAB%5Ceaqual.prj%27]mcc-F 'E:\MATLAB\eaqual.prj'[/url]等待...................................有点久当输出以下信息时编译成功了Compiler version:4.9(R2008b)Warning:Duplicate directory name:E:\MATLAB.mcc-W 'dotnet:eaqual,Eaqual,0.0,private'-d'E:\MATLAB\eaqual\src'-T'link:lib'-v'class{Eaqual:\Program Files\MATLAB\R2008b\toolbox\aero\aero\angle2quat.m}'Warning:Name is nonexistent or not a directory:D:\Program Files\MATLAB\R2008b\toolbox\compiler\patch.Warning:Name is nonexistent or not a directory:D:\Program Files\MATLAB\R2008b\toolbox\compiler\patch.Processing D:\Program Files\MATLAB\R2008b\toolbox\aero\mcc.enc Processing D:\Program Files\MATLAB\R2008b\toolbox\matlab\mcc.enc Processing include files...2item(s)added. Processing directories installed with MCR...The file E:\MATLAB\eaqual\src\mccExcludedFiles.log contains a list of functions excluded from the CTF archive.2item(s)added.Generating MATLAB path for the compiled application... Created40path items.Begin validation of MEX files:Sat Mar2815:35:112009End validation of MEX files:Sat Mar2815:35:112009Warning:Name is nonexistent or not a directory:D:\Program Files\MATLAB\R2008b\toolbox\compiler\patch.Deleting0temporary MEX authorization files.Parsing file"D:\Program Files\MATLAB\R2008b\toolbox\aero\aero\angle2quat.m"(Referenced from:"Compiler Command Line").Parsing file"D:\Program Files\MATLAB\R2008b\toolbox\compiler\deploy\deployprint.m"(Referenced from:"Compiler Command Line").Parsing file"D:\Program Files\MATLAB\R2008b\toolbox\compiler\deploy\printdlg.m"(Referenced from:"Compiler Command Line").Generating file"E:\MATLAB\eaqual\src\Eaqual.cs".Generating file "E:\MATLAB\eaqual\src\EaqualNative.cs".Generating file "E:\MATLAB\eaqual\src\readme.txt".Generating file "E:\MATLAB\eaqual\src\dotnet_mcc_component_data.cs".Executing command: C:\WINDOWS\\Framework\v2.0.50727\csc.exe/nologo/optimize /doc:"E:\MATLAB\eaqual\src\eaqual.xml"/t:library/r:"D:\Program Files\MATLAB\R2008b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll"/resource:"E:\MATLAB\eaqual\src\eaqual.ctf"/out:"E:\MATLAB\eaqual\src\eaqual.dll" "E:\MATLAB\eaqual\src\Eaqual.cs""E:\MATLAB\eaqual\src\dotnet_mcc_component_data.cs"Executing command: C:\WINDOWS\\Framework\v2.0.50727\csc.exe/nologo/optimize /doc:"E:\MATLAB\eaqual\src\eaqualNative.xml"/t:library/r:"D:\Program Files\MATLAB\R2008b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll"/resource:"E:\MATLAB\eaqual\src\eaqual.ctf"/out:"E:\MATLAB\eaqual\src\eaqualNative.dll""E:\MATLAB\eaqual\src\EaqualNative.cs" "E:\MATLAB\eaqual\src\dotnet_mcc_component_data.cs"Copying:E:\MATLAB\eaqual\src\eaqual.dll->E:\MATLAB\eaqual\distribCopying:E:\MATLAB\eaqual\src\eaqualNative.dll->E:\MATLAB\eaqual\distrib Copying:E:\MATLAB\eaqual\src\readme.txt->E:\MATLAB\eaqual\distribCompilation completed succesfully.The output is located in E:\MATLAB\eaqual\distrib.You can package the component by clicking on the"ackage"icon in the Deployment Tooltoolbar,or by clicking the Tools->ackage menu when the Deployment Tool panel is selected.To include additional files in the package,click Project->Settings).生成的文件在工程文件夹里面我的是E:\MATLAB\eaqual\distrib\angle2quat.dll至此MATLAB的操作全部完成打开VISUAL Studio2008新建C#工程我这里用的是控制台名为TestOfmatlab_consolt我的是E:\Visual Studio2008\Projects\TEST\TestOfmatlab_consolt添加引用E:\MATLAB\eaqual\distrib\angle2quat.dll和D:\Program Files\MATLAB\R2008b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll(这里我没有用MATLAB画图,所以只引用MWArray.dll)加入命名空间:using .Arrays;将下面代码加入Main函数eaqual.Eaqual eq=new eaqual.Eaqual();.Arrays.MWArray m=10,n=4,j=7,k;MWArray S="XYZ";k=eq.angle2quat((MWNumericArray)m,(MWNumericArray)n, (MWNumericArray)j,(MWCharArray)S);MWNumericArray temp=(MWNumericArray)k;double[,]location=(double[,])temp.ToArray(MWArrayComponent.Real);Console.WriteLine(location[0,0].ToString());Console.WriteLine(location[0,1].ToString());Console.WriteLine(k[2].ToString());Console.WriteLine(k[3].ToString());Console.WriteLine(k[4].ToString());Console.ReadLine();编译运行即可看到输出,此函数是姿态角转四元数函数,具体功能就不做说明了。
C++调用Matlab引擎及Eigen配置
C++调⽤Matlab引擎及Eigen配置
这个周开始要着⼿实现⽹格⽔印的代码了,虽然还什么都不会,但也只能⼀步步摸索着往前⾛了。
我要实现的论⽂题⽬是<<Watermarking 3D Polygonal Meshes in the Mesh Spectral Domain>>,之前的博客中有过这篇论⽂的理论分析,看起来貌似不难,但动⼿实现起来的时候还是挺困难的。
⾸先要解决的问题就是配置实验环境。
⼀开始我打算⽤Eigen对拉普拉斯矩阵进⾏特征值分解,因此就涉及到Eigen的配置。
Eigen是⼀个开源的矩阵运算库,⾥⾯封装了⼤量的矩阵操作,直接调⽤⾮常简单,其配置也很简单。
⼀、配置Eigen
1. 下载Eigen
2. 解压
3. 在项⽬中包含Eigen⽬录,具体操作如下图
右键单击项⽬,选择属性,在VC++⽬录下,在包含⽬录中将Eigen的⽬录包含进去即可。
⼆、配置matlab
1、添加包含⽬录
在C/C++下选择常规,在附件包含⽬录中添加Matlab安装位置下的extern/include和extern/include/win32
2、添加库
在库管理器下选择常规,在附加依赖项中添加libeng.lib, libmx.lib和libmat.lib
然后在附件库⽬录中添加matlab安装位置下的extern/lib/win32/microsoft
3、如果在调⽤引擎过程中遇到如下问题(计算机中丢失libeng.dll),在在系统变量中包含路径F:\Matlab_32\bin\win32即可。
matlab与C混合编程步骤详解
1MATLAB Compiler 是MATLAB自带的一个编译器,它能将m文件转化成 C、C++或p等各种类型的源代码,并根据需要生成可执行文件、lib文件(库文件)、dll文件或S函数文件等。
Matlab所使用的编译器包括了MATLAB 的C\C++数学库函数以及图形库。
必须保证编译器的正确配置,因为编译器使用了C\C++库函数,所以在使用前需要使用mex -setup 和 mbuild -setup两个命令对编译器进行配置。
步骤如下:1. 设置Matlab的编译器,使用外部的VC或者gcc等编译器。
2. 编译m文件成dll3. 设置VC等的继承环境,设置C需要用到的静态库和动态库4. 编写C调用dll1.1设置MATLAB编译器首先要安装Matlab 编译器,一般来说,在安装了Matlab后编译器就己经安装了,所在就只需要对Matlab编译器进行设置。
1.1.1 编译环境设置首先设置系统的环境变量,点击“我的电脑”属性-→系统特性--→高级-→环境变量-→添加系统变量Matlab值为Matlab的安装路径:G:\matlab7.0\bin\win32,重启电脑即可。
1.1.2 MATLAB7.0 编译器设置(a) 为编译后产生的MEX文件进行预配置在Matlab 的命令窗口(Command Window) 键入“mex -setup ”命令后,按回车键,安装Matlab 编译器;(b) 为产生独立外部应用程序进行预配置对Matlab编译器mbuild应用程序进行设置,运行Matlab ,在Matlab 的命令窗口(Command Window) 键入“mbuild -setup ”命令后,按回车键,安装Matlab 编译器;1.2 将MATLAB函数转成DLL函数在Matlab的Command Window /下输入命令:命令 1 :mcc -W lib:dlltest -T link:lib huatu_test.m或命令 2 :mcc -W cpplib: dlltest -T link:lib huatu_test.m命令1生成的是C,命令2生产的是C++。
基于COM的VC调用Matlab的方法及实现
甚 j百 行 代码 。 =
t e d t id e hd o e l e 秆a 8 e a 8 b t e n h e ae m to t rai l z n f r d t e w e
Ma a  ̄V 是 目前应用最广 泛的工程仿 t b lC l
真 和 开发 软 件 ,但 是 它 们 有 着 各 自的 优 缺 点。Mal t b具有 强大 的矩阵 运算 、数据 处理 a 和 图形 显示 功能 ,其输 出结 果可 视化 ,编 程
法 厦其各 的优 块. 点.然后鳍合 详 细的 实例
运 行速 度 、功能 性 以及 应用 程序 界面 开发 方
面功能强大 ,但是在数值计算和数据可视化
方 面 ,VC并不具 备太 多优 势 ,在 Malb中 t a
一
两行代码 就 可以实现 的功能在 V 中要 儿十 C
中那样精 细的 图形 , 且对 于有的 绘图语句 也 而
不 支持 。现 在 M ah os公 司已 经被生 产 t To l Mal t b的 Mah ok 公司兼 并 ,之后部 分 a tW r s Macm的 内容 被合并  ̄Mah r s i a t o 1 twok的V s l ] u Malb中 。 t a 4 )使用 Mal 的cmb i eT具 。 O t b o ul r . C M a d 是 C mp n n j tMo ue的简称 ,它 o o e tObe d l c
T i h ss ie a r f i r d c i o p a t a hs e i v s b l jt o u t n f r c i l t g e n o c s nf a c o h c m ia in f a l ih C, i ii n e f t e o bn t o M t b w t V g c o a a a5 日 SV P Is e i c w& 8 o h w o m lme t n l B8 B B & p cf y n o t iPe n f i i , a v n a e a d ds na e O 甑c w y & e t d atg s n i tg s f W n a r nj e t n d觞 W l hn 1i D e .T e ^ h 1 f t ec ) 删船 协 船Fosr t a n nta e
Matlab与C#混合编程
Matlab与C#混合编程的实现关于matlab与c#之间一些数据类型的转换的方法,我也曾经写过。
总结一下,最主要的是要完成下面几个步骤:1、同时安装.netframwork与MCR(matlab compile runtime)。
这个在装完 与matlab以后,前面2个组件也就安装好了。
2、利用matlab自带的.nettool工具将.m文件转换成.net组件--->.dll文件为接口,它实际上不含任何实现,都是调用另一个.ctf文件来完成具体的功能。
3、在c#中,必须引入mwarray.dll才能拥有在.net中进行矩阵运算所需要的一切。
虽然matlab help中只是说推荐,但一般的应用中,只是进行一部分函数的调用,而不是去取得整个运行结果。
这个.dll是必须引入的。
有时mclmcrrt74.dll这个文件也需要引入。
根据具体的要求,需要引入的文件也有所差别。
4、生成一个实例,并对.net组件所输出的结果进行数据类型的转换,以符合.net 编程环境中对数据类型的要求,这个在以前我已经讲过,这里就不再多说了。
关键是掌握如何把一个矩阵(在matlab中,一个m*n的矩阵对应.net中的一个1*(m*n)的数组)转换成数据类型一致的数组。
目前所有的matlab数据类型(无论什么类型,都可以把它看成一个矩阵,这样就可以利用数组的思想来思考)都可以进行转化,具体的可能需要经过实验才能符合各自的要求。
虽然matab对.net的支持不如它对c++支持的功能强大,但也已经满足了我们实际应用的需求。
如果我们可以把大部分的运算都放在matlab里面完成,数据转换的数量又少,那么整个系统的运行速度与效率还是挺高的。
c#与matlab混合编程图解using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;namespace ConsoleApplication1{class Program{static void Main(string[] args){Program p = new Program();p.MatlabTest();Console.WriteLine("按任意键退出...");Console.ReadKey();}/// <summary>/// 测试C# matlab调用/// </summary>private void MatlabTest(){Console.WriteLine("正在载入matlab for .NET库......"); DotNetTest.DotNetTestclass dt = newDotNetTest.DotNetTestclass();Console.WriteLine("完成......");Console.WriteLine("-----------------------------------------------");// 多项式int demention = 3;double[] dd = new double[demention];dd[0] = 1;dd[1] = 4;dd[2] = 6;//.Arrays.MWArray d =// .Arrays.MWNumericArray.MakeSpar se(// 1, demention,.Arrays.MWArrayComplexity.Real, demention);.Arrays.MWNumericArray d = (.Arrays.MWNumericArray)dd;Console.WriteLine("开始计算多项式:[{0}] ......",d.ToString());// 存储计算结果.Arrays.MWArray h;// 调用matlab函数计算h = dt.myroots(d);// 取得实部Array real =((.Arrays.MWNumericArray)h).ToArray(MathWorks.MAT .Arrays.MWArrayComponent.Real);string realpart = "实部列表:";foreach (double i in real){realpart += i + "\t";}// 取得虚部Array imaginary =((.Arrays.MWNumericArray)h).ToArray(MathWorks.MAT .Arrays.MWArrayComponent.Imaginary);string imaginarypart = "虚部列表:";foreach (double i in imaginary){imaginarypart += i + "\t";}Console.WriteLine(realpart);Console.WriteLine(imaginarypart);// 打印结果Console.WriteLine("计算结果:");Console.WriteLine(h.ToString());}}}C#与Matlab混合编程的几种方式1. 通过从Matlab的*.m文件中生成C语言版本的DLL具体过程:1) 在Matlab中写好一个m文件(比如一个简单的加法函数myplus.m);2) 使用Matlab的mbuild -setup选择编译器,我机器上的编译器有两个LCC 和VC2008(注意如果使用做应用的话,建议编译器选VC2008,否则C#中会告诉你DLL找不到Entry Point)3) 在命令行中使用mcc -B csharedlib:mypluslib myplus.m (如果是多个M文件,接着往后写),等待几十秒之后会生成若干文件(*.c, *.h, *.dll等), 其中.h文件中有导出的函数原型。
C 中调用MATLAB方法
三种方式在C++中调用matlabC/C++调用Matlab在工程实践中,C/C++调用Matlab的方法主要有调用Matlab计算引擎、包含m文件转换的C/C++文件,以及调用m文件生成的DLL文件。
1利用Matlab计算引擎Matlab的引擎库为用户提供了一些接口函数,利用这些接口函数,用户在自己的程序中以计算引擎方式调用Matlab文件。
该方法采用客户机/服务器的方式,利用Matlab引擎将Matlab和C/C++联系起来。
在实际应用中,C/C++程序为客户机,Matlab作为本地服务器。
C/C++程序向Matlab计算引擎传递命令和数据信息,并从Matlab计算引擎接收数据信息。
Matlab提供了以下几个C语言计算引擎访问函数供用户使用: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(HANDLEhInstance,HANDLE hPrevInstance,LPSTR lpszCmdLine,intnCmdShow){Engine*ep;mxArray*P=NULL,*r=NULL;char buffer[301];doublepoly[4]={1,0,-2,5};if(!(ep=engOpen(NULL))){fprintf(stderr,"\nCan'tstart MATLAB engine\n");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下运行example2.exe:mex-f example2.c。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++与Matlab混合编程之一:调用Matlab引擎在VC中调用MATLAB的,总结有以下几种方法:1、是调用Matlab引擎;2、是调用Matlab中M函数转化成的dll文件;3、调用Matlab中M函数转化成c语言的函数。
本节之讲解方法1,因为方法1最简单,只要配置好VC的相关设置就可以了。
下面是自己的实践过程:
一、设置VC相关属性。
(1)Visual C++6.0 编译环境的设置:通过菜单Tools/ Options,打开Visual C++6.0设置属性页,进入Directorie页面,在Show Directories for下拉列表中选择Include Files,添加路径:<matlab>\extern\include(在Matlab的安装路径下);再选择下拉列表中的Library Files,添加路径:<matlab>\extern\ lib\win32\Microsoft(在Matlab的安装路径下,但是在我查看资料的时候看到很多是<matlab>\extern\ lib\win32\Microsoft\msvc60这个路径,但是我用的是MatlabR2009a,或许这里设置有点区别)。
看资料说编译环境或许只需设置一次,但是我在设置的时候每次都要设置。
(2)添加库文件: 通过菜单Projects|settings,进入Link 页面,在Object/Library Modules 框中,添加库文件名:libmx.lib 、libmat.lib 、libeng.lib。
每个新的工程文件都要单独添加库文件。
二、在VC中通过MATLAB引擎调用Matlab函数命令:
现在以画一个正弦曲线的图为例。
1、新建一个MFC程序,命名Test,基于对话框。
2、在Testdlg.cpp中加入头文件:
#include "engine.h"
#include <stdlib.h>
3、添加botton Test,并添加点击命令,加入代码如下:
voidCTestDlg::OnTest()
{
// TODO: Add your control notification handler code here
Engine *ep;
if (!(ep = engOpen(NULL))) //打开Matlab引擎
{
MessageBox ("Can't start MATLAB engine", MB_OK);
exit(-1);
}
engSetVisible(ep, 0);
engEvalString(ep,"x=0:0.001:2*pi;");
engEvalString(ep,"y=sin(x);");
engEvalString(ep,"plot(x,y)");//会显示出图
}
4、运行程序,单击Test按钮,运行结果如下图:
至此,利用VC调用Matlab引擎结束,可以运行Matlab中的各种函数,作图等。
此种方法的特点是,非常简单和方便,要求运行程序的电脑必须装有Matlab软件,因此也具有不能脱离Matlab环境的弱点。
备注:此次测试是基于Visual C++6.0和Matlab R2009a的环境。
上面例子是VC和Matlab的混合编程的一个简单应用,在实际的数值计算,控制系统开发等工程应用中,可以很好的利用VC和Matlab的混合编程技术,从而简化应用程序的开发工作量。
下一篇文章将推出第二种方法:利用Matlab生成DLL文件,然后用VC调用DLL文件,此种方法是将Matlab写的函数封装在动态链接库里面,然后用VC调用动态链接库,优点是程序的运行可以脱离Matlab的环境独立运行。