Matlab程序在VC中的调用
vc++中调用matlab函数的方法:COM组件
在利用vc++编程时,常需要一些特殊的数学函数,因此可以调用matlab中的强大的数学函数,通常使用的方法有引擎和com方法。
下面对此两种方法进行简单介绍。
1。
引擎,如何设置?matlab安装在c:\matlab6p5操作系统:windows2000(1)在vc中把“工具”-〉“选择”菜单中的“目录”选项卡中设置好include(C:\MATLAB6P5\EXTERN\INCLUDE),executable files(c:\matlab6p5\bin\win32)和library(C:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60)目录,包括进来上面这两个目录。
(2)在C:\MATLAB6p5\bin\win32\mexopts下双击msvc60opts.bat和msvc60engmatopts.bat(3)在vc中把“工程”-〉“设置”选项卡中的Link的“对象/模块库”中再加上以下内容:libeng.lib libmat.lib libmatlb.lib libmatlbmx.liblibmex.lib libmmfile.lib libmwarpack.lib libmwlapack.liblibmwmcl.lib libmwrefblas.lib libmwservices.lib libmwsglm.liblibmx.lib libut.lib mclcommain.lib sgl.lib(4)最后在编写程序时加入这么一句预编译语句#include<c:\matlab6p5\extern\include\engine.h>2。
com组件首先,设置合适的编译器。
在MATLAB命令窗口里敲:mbuild–setup和mex–setup,完成编译器的设置。
●Please choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers[y]/n?y●Select a compiler:[1]Lcc C version2.4in C:\MATLAB7\sys\lcc[2]Microsoft Visual C/C++version6.0in C:\Program Files\Microsoft Visual Studio[0]NoneCompiler:2●Please verify your choices:Compiler:Microsoft Visual C/C++6.0Location:C:\Program Files\Microsoft Visual StudioAre these correct?([y]/n):y●Try to update options file:C:\Documents and Settings\Administrator\ApplicationData\MathWorks\MATLAB\R14\compopts.batFrom template:C:\MATLAB7\BIN\WIN32\mbuildopts\msvc60compp.batDone...-->"C:\MATLAB7\bin\win32\mwregsvr C:\MATLAB7\bin\win32\mwcomutil.dll"DllRegisterServer in C:\MATLAB7\bin\win32\mwcomutil.dll succeeded-->"C:\MATLAB7\bin\win32\mwregsvr C:\MATLAB7\bin\win32\mwcommgr.dll"DllRegisterServer in C:\MATLAB7\bin\win32\mwcommgr.dll succeeded●Please choose your compiler for building external interface(MEX)files:Would you like mex to locate installed compilers[y]/n?y●Select a compiler:[1]Digital Visual Fortran version6.0in C:\Program Files\Microsoft Visual Studio[2]Lcc C version2.4in C:\MATLAB7\sys\lcc[3]Microsoft Visual C/C++version6.0in C:\Program Files\Microsoft Visual Studio[0]NoneCompiler:3●Please verify your choices:Compiler:Microsoft Visual C/C++6.0Location:C:\Program Files\Microsoft Visual StudioAre these correct?([y]/n):yTry to update options file:C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R14\mexopts.batFrom template:C:\MATLAB7\BIN\WIN32\mexopts\msvc60opts.batDone...1.设置系统路径。
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)步就解决这个问题的。
Matlab调用VC生成的dll的具体步骤
Matlab调用C生成的dll的具体步骤一、C生成dll文件(以vs2008为例)1创建项目: Win32->Win32项目,名称:MyDLL2新建头文件testdll.h,并编写相关程序注:一定要注意头文件的写法,此法是支持C的头文件,Matlab调用DLL只支持用C 语法写成的DLL,C++的一些关键特性如类、继承等都不支持,用起来的话局限性很大的,还不如单独再用M文件把算法再写一遍进行仿真呢。
具体程序如下#ifndef MATLABDLLTEST_H#define MATLABDLLTEST_H#ifdef __cplusplusextern "C"{#endif__declspec(dllexport) double add(double x, double y);#ifdef __cplusplus}#endif#endif3新建源文件testdll.cpp,并编写相关程序具体程序如下所示:#include "stdafx.h"#include "testdll.h"double add(double x, double y){return (x+y);}4新建模块定义文件mydll.def,并编写相关程序二、Matlab调用生成的dll1、编译器准备1)在Matlab的命令窗口输入:mex -setup2)选择你的编译器,我的是:[2] Microsoft Visual C++ 2008 SP1 in c:\Program Files\Microsoft Visual Studio 9.02、加载DLL:把编译连接之后产生的myDLL.dll和testdll.h文件拷贝到Matlab的当前工作目录下,并编写.m函数具体程序clc;clear all;close all;addpath('dll的具体路径即Matlab的当前工作路径')%输入dll文件具体的存储路径loadlibraryMyDLLtestDLL.h alias lib%加载MyDLL库,并重命名为lib,注意加载时常常需要MyDLL的头文件libfunctionsview lib %执行此命令后会生成如下窗口calllib('lib', 'add', 1.0,2.0)%只有出现上述窗口才能使用此命令参考链接:1、/s/blog_70b3b3a701015e98.html(此文忘记加模块定义文件mydll.def,而且在Matlab读取路径是的指令也是错误的,参考本文的指令就能跑通)2、/g710710/article/details/7255744(此链接的文章是VS生成dll的方法,但如果想用Matlab调用生成的dll在编写头文件时一定要用上文的编写指令,而不这篇链接里的指令,因为链接里的指令是生成C++的指令,而Matlab只识别C的写法)。
C++调用matlab动态库
C++调用matlab动态库环境:Windows 7旗舰版(32位),VS2008,Matlab R2010b1. matlab中dll创建1.1 m文件编写function t = func(file)t=2;end将M文件保存为func.m,保存在d:/test文件夹中。
1.2 设置编译器在Matlab主窗口中将当前文件夹改为d:/test。
为了能够让VC调用Matlab程序,我们可以采用将Matlab程序包装成动态链接文件DLL的形式,然后让VC调用动态链接文件,因此在Matlab中,我们需要设置一下Matlab的编译库,在Matlab主窗口中键入如下代码:mex -setup然后出现Please choose your compiler for building external interface (MEX) files:Would you like mex to locate installed compilers [y]/n?键入y后回车,出现Select a compiler:[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\Matlab\sys\lcc[2] Microsoft Visual C++ 2008 SP1 in D:\Program Files\Microsoft Visual Studio 9.0[0] NoneCompiler:由于我们是需要用VC来调用Matlab函数,因此我们选择2,回车,出现Please verify your choices:Compiler: Microsoft Visual C++ 2008 SP1Location: D:\Program Files\Microsoft Visual Studio 9.0Are these correct [y]/n?键入y后回车,出现*************************************************************** ************Warning: MEX-files generated using Microsoft Visual C++ 2008 requirethat Microsoft Visual Studio 2008 run-time libraries beavailable on the computer they are run on.If you plan to redistribute your MEX-files to other MATLAB users, be sure that they have the run-time libraries.*************************************************************** ************Trying to update options file: C:\Users\Administrator\AppData\Roaming\MathWorks\MATLAB \R2010b\mexopts.bat From template:D:\PROGRA~1\Matlab\bin\win32\mexopts\msvc90opts.bat Done . . .*************************************************************** ***********Warning: The MATLAB C and Fortran API has changed to support MATLABvariables with more than 2^32-1 elements. In the near future you will be required to update your code to utilize the new API. You can find more information about this at:/doc/35346238.html,/support/solutio ns/en/data/1-5C27B9/?solution=1-5C27B9 Building with the -largeArrayDims option enables the new API.*************************************************************** ***********如果出现以上说明,则证明Matlab编译器设置成功了。
使用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混合编程方法的研究与实现
何 利 用 M r A 自带 的 编 译 器 通 过 ME 方 法 实现 在 MA L B程 序 中调 用 V 函数 , 结 合 实 际 给 出 了一 个 在 辅 Ar B L X TA C 并 助 教 学软 件 中 实 现 自动 索 引 的具 体 例 子 。 运 行 结 果 证 明 该 方 法 能 够 有 效 解 决 基 于 MA I B语 言 开 发 的 软 件 中 帮 TA 助 文 档 精 确 定 位 的 问题 . 为 其 他 类 似 应 用 提 供 参 考 。 并
VC++中使用MATLAB的C++数学库和MCC生成的程序
(2)启动VC,创建MFC AppWizard(dll)程序框架
(3)设置系统选项
a. 设定头文件和库文件路径
菜单Tools->Options->Directories
Include files:添加c:\matlab\extern\include
3、设置编译环境
Tools->Options->Directories
Include fiels添加:
c:\matlab\extern\include
c:\matlab\extern\include\cpp
Library fiels添加:
C:\MATLAB\extern\include>lib /def:matlab.def /out:matlab.lib
Microsoft (R) Library Manager Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserveATLAB下用下面格式的命令生成cpp文件
mcc -t -L Cpp test
得到test.hpp, test.cpp
将test.cpp加入项目, 不做任何改动.
Link->Object/Library modules: 添加matlab.lib
注1. 其它优化、调试以及头文件、库文件等选项看情况调整
注2. Release版在General->Microsoft Foundation Classes选项中,
这里先说明一下:
MATLAB程序test.m:
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 中调用。
在C++中调用Matlab
二、程序实现
我们通过一个简单的程序demo.c来说明C、C++对Matlab的调用。
#include
#include
#include
#include
/*在头文件中加入engine.h。其包含了调用的Matlab函数声明。*/
#include "engine.h"
在c,c++中调用Matlab
在பைடு நூலகம்,c++中调用Matlab
在C、C++中调用Matlab
Matlab是美国MathWorks公司的产品,是一种以矩阵为基本编程单位的高效数值计算语言。Matlab集科学计算、图像处理、声音处理于一体,为用户提供了丰富的Windows图形界面设计方法,使用户能够在利用其强大数值计算功能的同时设计出友好的图形界面
engClose(ep);
mxDestroyArray(a_ptr);
return(0);
}
当然,该程序在编译之前还需设置一些环境参数。在不同的开发环境中,其设置方法略有差异,我们以Borland C++ builder开发平台为例加以说明。
1)首先必须完成Matlab中链接库的导入工作。在Matlab\extern\include中存在_libmx.def、_libmat.def、_libeng.def等定义文件,在DOS环境中对它们执行命令:
另一种方式是选择将一个自定义的数据结构复制到mxArray中,值得注意的是Matlab在存储矩阵时是按列序保存的,而在C、C++中是按行序保存的,所以转换时注意分清下标。
3)调用engPutArray函数将矩阵放入到Matlab工作区中。
VC++调用MATLAB库函数实现数据计算与图形显示的方法
在M LB AT A T编 写 . 文 件 m
j }
利 用mc c编 译 . 文件 m
生 成 相 应 的 .p 与 .p 文 件 cp hp
』 }
在 Vc+ 工 程 中 插 A.p 与 -p 文 件 + cp hp
j l
在 工 程 中 进  ̄ AT 3 NI LAB 数 学 库 和 始 化 设 置 与 关 闭 库 的 初
维普资讯
中国 西部 科技 2 0 年9 ( 0 8 月 下旬 ) 7 第0 卷第2 期 总第 1 2 7 5 期
V + 调用MA L B C+ T A 库函数 实现数据计算与图形显示的方法
李正斌 李 珂
( 阳 工 学 院 ,河 南 安 阳 4 5 0 ) 安 5 0 0
l 概 述
把大 部 分 的 . 文件 写成 的应 用 程序编 译成 可 执行 的 e e m x
程 序 , 脱 离 M T A 环 境 独 立 运 行 。 当然 也 可 以 将 . m 文 ALB 件 编 译 成 C P 文 件 ,添 加 到 V + 工 程 中 , 实 现 V + 和 P C+ C+
M T A 的混合编程 ,使应用程序 同样可 以脱离MT A 环境 ALB ALB 独立运行,但不 能利用M T A 的图形旬柄能力 。 ALB
22具体编程方法和软件设置步骤 .
图1 展示 了如何在 V + 中利 用 M T A c+ , L B数 学库 和图形 \ 库实现计算结果可视化方法 的步骤 。
C++如何调用matlab函数
C++如何调用matlab函数
C++如何调用matlab函数
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的.基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
C++如何调用matlab 函数?下面就一起来了解看看吧!
本来电脑上安装的是matlab2012b,但是好像2012b只有64位的,故重新安装matlab7,安装完注册一下,cmd cd到matlab7的程序目录bin文件夹下,注册 matlab /regserver,就可以调用matlab了,先测试第一种方法,调用引擎,engOpen、engSetVisible、engClose
engEvalString(m_pEngine, "x1 = 0.01 : 0.01 : 10 * pi");
engEvalString(m_pEngine, "x2 = -10 * pi : 0.01 : -0.01");
engEvalString(m_pEngine, "y1 = sin(x1)./x1");
engEvalString(m_pEngine, "y2 = sin(x2)./x2");
engEvalString(m_pEngine, "plot([x2 x1], [y2 y1])");
在台式机上可以运行,但是到了笔记本上engOpen返回false,经过研究发现有可能是管理员权限的问题,
项目右键-属性-链接器-清单文件-uac执行级别选择requireAdministrator,重新编译运行果然正确了,先记录下来。
【C++如何调用matlab函数】。
MATLAB转换为C++程序的方法
Matlab 转换为VC++程序一、将MATLAB程序或函数打包为可独立运行的exe程序1.首先安装支持MATLAB 生成程序运行的动态链接库,路径:D:\MATLAB704\toolbox\compiler\deploy\win32\MCRInstaller.exe2.写好.m 程序,一般为函数,可以有输入输出参数3.在MATLAB里运行mcc -mv *.m4.运行exe程序即可得到结果。
5.可在命令行中输入参数二、在VC++中调用MATLAB计算引擎1.将MATLAB注册为COM服务器在WINDOWS下运行Matlab/regserver2.将engine.h 所在的目录加入编译器对头文件的搜索路径上,一般是:$MATLAB\extern\include, 把引擎函数库所在的目录加入搜索路径,一般是:3.把需要的函数库文件加入到编译所需的额外库文件参数中,文件名为:libeng.lib; libmx.lib; libmat.lib 等4.定义引擎变量,并且初始化Engine* m_ep=NULL;//fjif(!(m_ep=engOpen("\0"))){AfxMessageBox("Can't start MATLAB Engine!");return NULL;}//hide the command windowengSetVisible(m_ep,0);5.构造输入输出参数mxArray *mxImage=NULL,*mxResult=NULL;mxImage=mxCreateNumericMatrix(m_nImageWidth,m_nImageHeight,mxUINT16_CLASS,mxREAL);memcpy((short*)mxGetPr(mxImage),(short*)m_pImageBuffer,m_nBuffSize);engPutVariable(m_ep,"image",mxImage);6.构造MATLAB命令//engEvalString(m_ep,"figure;");//engEvalString(m_ep,"imshow(image,[]);");//Evaluate the function of timeCString szStrel;szStrel.Format ("strcElement=strel('square',%d);",nSeSize);engEvalString(m_ep,szStrel);engEvalString(m_ep,"result=imopen(image,strcElement);");engEvalString(m_ep,"result=imclose(result,strcElement);");//plot the result//engEvalString(m_ep,"figure;");//engEvalString(m_ep,"imshow(result,[]);");7.接收输出结果mxResult=mxCreateNumericMatrix(m_nImageWidth,m_nImageHeight,mxUINT16_CLASS,mxREAL);mxResult=engGetVariable(m_ep,"result");memcpy((short*)pMorphImage->m_pImageBuffer,(short*)mxGetPr(mxResult),m_nBuffSize);8.销毁MATLAB环境中使用的内存变量//destroy the arraymxDestroyArray(mxImage);mxDestroyArray(mxResult);if(ep!=NULL)engClose(ep);三、在VC++中调用MATLAB生成的动态链接库1.安装VC++编译器在Matlab环境下,输入 mbuild –setup 根据指示配置C++编译器2.在MATLAB环境中编译MATLAB函数mcc –w cpplib: ***.lib -T link: lib ***.m ***.m生成的和必须复制到VC程序当前目录下的文件有:***.h ***.lib ***.dll 和 ***.ctf3.在VC环境调用生成的动态链接库(a)初始化应用程序和库(经实验此段必须放在APP的InitInstance()函数中)if(!mclInitializeApplication(NULL,0)){AfxMessageBox(_T("Could not initialize the application"));return FALSE;}else;//AfxMessageBox(_T("Successfully initialize the application"));if(!LibBraExrInitialize()){AfxMessageBox(_T("Could not initialize the library"));return FALSE;}else;//AfxMessageBox(_T("Successfully initialize the library"));(b)初始化输入输出参数//定义matlab可以识别的矩阵作为输入和输出mwArray mwImage(m_nImageWidth,m_nImageHeight, mxINT16_CLASS, mxREAL);mwImage.SetData (m_pImageBuffer,m_nImageWidth * m_nImageHeight);int nThreshold[1]={0};mwArray mwThreshold(1,1,mxUINT8_CLASS,mxREAL);mwThreshold.SetData (nThreshold,1);(c)调用MATLAB函数并获得输出结果DY_FUN_OTSU(1,mwThreshold,mwImage);mwThreshold.GetData (nThreshold,1);(d)销毁MATLAB使用的环境变量LibBraExrTerminate();mclTerminateApplication();四、在VC++中调用MATLAB生成的COM组件1.安装VC++编译器在Matlab环境下,输入 mbuild –setup 根据指示配置C++编译器2.在MATLAB环境中编译MATLAB函数使用dotnettool:创建新工程;加入M程序;编译工程;打包和发布产生的COM组件产生的DLL文件需要复制到当前程序目录下,如需发布,需要用***.exe程序解压,并执行install.bat3.在VC环境调用生成的动态链接库(a)导入DLL(在stdafx.h文件中)#import "EdgeExtraction_1_0.dll" raw_interfaces_onlyusing namespace EdgeExtraction;(b)初始化和启动COMCoInitialize(NULL); //initialize COM libraryhresult=CLSIDFromProgID(OLESTR("EdgeExtraction.EdgeExtractionclass.1_0"), &clsid); //retrieve CLSID of componentIEdgeExtractionclass *t;hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(IEdgeExtra ctionclass),(LPVOID *) &t);if(FAILED(hresult)){AfxMessageBox("COM 启动失败!");return NULL;}(c)定义输入输出变量VARIANT input, output; //定义输入输出变量VariantInit(&input);VariantInit(&output);//VariantInit(&output1);input.vt= VT_I2 |VT_ARRAY;//声明输入的类型为VT_ARRAY,Array中的元素为short型output.vt=VT_I2 |VT_ARRAY; //声明输出的类型为VT_ARRAY,Array中的元素为short型//output.vt=VT_R8;//output1.vt=VT_R8;SAFEARRAYBOUND abound[2];abound[0].cElements=m_nImageHeight;//第一维元素的个数abound[0].lLbound=0; //第一维矩阵索引的下界abound[1].cElements=m_nImageWidth;//第二维元素的个数abound[1].lLbound =0;//第二维矩阵索引的下界input.parray=SafeArrayCreate(VT_I2,2,abound);//该函数新建一个SafeArray,并把这个SafeArray的描述符的指针传给x.parray。
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命令提示符后执行上述命令,重新注册。
基于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
浅析VC与Matlab联合编程(二)
::首页>> 文档中心>> 在线杂志>> 其它[ 在线杂志第42期][ 原创文档本文适合中级读者已阅读231次]浅析VC与Matlab联合编程(二)作者:邓科下载源代码在“浅析VC与Matlab联合编程(一)”中简单介绍了VC与matcom的接口编程,实现本功能,要真正熟练使用接口编程,还要对函数调用有一定了解。
本文通过一个实例,较详细的介编译后的函数。
首先新建一个函数huatu.m,该函数的功能是:接受用户输入的左端点值和右端点值两个输图形。
函数还将生成两个随机数,作为一个点的坐标在图中打印出来(绿点),用来说明如何在步骤如下:1.建立一个名为Example2基于对话框的MFC(exe)工程。
2.在matcom中新建一个名为huatu.m文件,如图1;图13.在matcom命令窗口中运行该函数,如图2;图24.将生成的huatu.h、huatu.cpp(默认位置为安装目录:\matcom45\samples\Debug)和ma 为安装目录:\matcom45\lib)四个文件拷贝到建立的工程Example2目录下。
5.将第四步拷贝的四个文件加入到VC工程中:工程->添加工程->文件,选择刚才拷贝到Exa 成后如图3;图36.在Example2dlg.cpp中添加头文件:(如图4所示)#include "matlib.h"#include "huatu.h"图47.为工程建立界面:添加一个Button按扭控件;添加四个Edit box控件,用于显示数据;添加显示文字,一个显示图形,将显示图形的Static text的ID设置为ID_PIC。
其他所有控件属性保适当调整显示图形Static text控件的边缘)。
如图5所示图58.按Ctrl+W为控件添加变量。
如图6所示图69.为Button1按钮添加响应代码。
如图7所示图710.运行程序,输入左端点和右端点,点击”画图”按钮,结果如图8所示。
VC++调用Matlab实现图像处理的3种常用方法比较
A sr c :Cal g M a l b i bt t a l n ta n VC+ 4 e v r n n o p o e s i g s i a e f c i e s o tu y Th s p p r i to u e i - n i me t t r c s ma e s fe t h r c t wa . o v i a e n r d c s t r e c mmo t o s f rc mb n d p o r mmi g b t e h e o n me h d o o i e r g a n ewe n VC 4 a d M a l b Th h e o - 4- n t . a e t r e c mmo t o s a o t Ma lb n me h d d p ta e gn ,M ATCOM o i ra d COM u l e .Th h e t o sa ec mp r d a d r s a c e e al nt e a p c so l w n ie c mp l n e B i r d et r eme h d r o a e n e e r h d i d t i i h s e t ffo n r aia i n a a e c a g ,f n t n c l,r n ig r t ,g a h ci g u c i n s p o ta d p o r m e e s . Th d a t g s e l t ,d t x h n e u c i al u n n a e r p i ma e f n t u p r n r g a r l a e z o o o ea v na e
董 建 婷 ,王 杰
( 京 空 间 机 电研 究所 , 京 北 Mal c t b实现 图像 处理 是 一 种 快 捷 高 效 的 方 法 。针 对利 用 Mal a t b引 擎、 用 MA C M 编 译 器 a 利 T O
VC调用matlab的linprog函数-----自己的总结
VC调用matlab的linprog函数-----自己的总结1.编写m文件function [X,f]=lin(f,A,b)[x,fval] = linprog(f,A,b);X=x;f=fval;End保存为lin.m2.将m文件编译为dllmcc -W cpplib:liblin -T link:lib lin.m -v其中,libname为编译后的库文件名,lin.m为matlab的m文件名该命令用于mwArray数据类型生成四个文件(用到的):liblin.ctf liblin.dll liblin.h liblin.lib3.VC++6.0工程的创建与设置(1)建立一个名为Test的C++控制台工程,在工程中添加一个名为test.cpp文件(2)对VC++6.0的设置(与matlab关联,一旦设置后以后就不需再修改)----工具--->选项---->目录----->include files: 加入--e:\matlab7\extern\inlcude------>Library files:加入--e:\matlab7\exterm\lib\win32\microsoft\msvc60(3)针对该工程的设置:工程---->设置----->连接---->对象/库模块:加入mclmcrrt.libliblin.lib(自己制作dll时生成的库文件)注:也可以不在这里设置,在test.cpp文件中加入:#pragma comment(lib,"mclmcr.lib")#pragma comment(lib,"liblin.lib")(4)将前面生成的四个文件(matlab的works文件夹下)添加到VC6.0建立的工程目录下,将liblin.h添加到工程(工程--->添加到工程---->文件)例: min f = -4x1- x2,s.t. -x1+2x2<=42x1+3x2<=12x1-x2<=3x1,x2>=0(1)在matlab中计算:>> f = [-4;-1];>>A = [-1 2; 2 3; 1 -1];>>b = [4;12;3];>>[x,fval] = linprog(f,A,b)(2)在VC中调用dll具体代码:#include <iostream>using namespace std;#include "mclmcr.h"//mwArray类型定义#include "liblin.h"dll的头文件#pragma comment(lib,"mclmcr.lib")#pragma comment(lib,"liblin.lib")int main(){//初始化程序if(!mclInitializeApplication(NULL,0)){cout<<"Could not initialize the application!";exit(1);}//初始化库if(!liblinInitialize()){cout<<"Could not Initialize the library!";exit(1);}//输入参数f,A,bmwArray A(3,2,mxDOUBLE_CLASS);mwArray f(2,1,mxDOUBLE_CLASS);mwArray b(3,1,mxDOUBLE_CLASS);//输出参数X,fvalmwArray X(2,1,mxDOUBLE_CLASS);mwArray fval(1,1,mxDOUBLE_CLASS);//输入,传给mwArraydouble aa[]={-1,2,1,2,3,-1};//注意,这里的约束系数与在matlab中的不一样double bb[]={4,12,3};double ff[]={-4,-1};//给f,A,b赋值A.SetData(aa,6);b.SetData(bb,3);f.SetData(ff,2);//调用函数lin(2,X,fval,f,A,b);//从X,fval取值double* x;double* fv;x = new double[2];fv = new double[1];X.GetData(x,2);fval.GetData(fv,1);//输出结果cout<<"X = "<<x[0]<<" "<<x[1]<<endl; cout<<"fv = "<<fv[0]<<endl;//关闭库和程序liblinTerminate(); mclTerminateApplication();return 0;}。
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)。
Matlab程序在VC中的调用摘要:利用vc与matlab接口技术,用VC 调用Matlab 编译的DLL 文件进行复杂数据处理不仅简洁通用,更具有很强的实用性和可扩展性,在科学计算与工程运用领域具有广泛的推广应用价值。
关键词:MATLAB ;VC;DLL ;接口
1. VC与MATLAB简介
VC 是大家都非常熟悉的一个软件,它是MicroSoft公司开发的在Windows 环境下主要环境之一,用其中的MFC 可以快速方便地编写出各种友好的用户界面,且用VC ++ 开发的系统具有容易维护升级、界面友好,代码效率高、执行速度快等一系列优点,因此已成为目前应用中的主流之一。
①、MATLAB是Mathworks 公司开发出的一款著名软件,如今已成为世界上使用最广泛的数学软件,它具有强大的数值计算、数据处理、图象显示、符号运算、系统分析、模拟仿真功能,由于受到各个领域专家学者的青睐,在他们的共同努力下,经过多年的发展,如今的Matlab 不仅拥有功能完善的内部函数库,更有专用于各领域的强大包,在这个平台上只需寥寥数语便可完成在其它环境中复杂度不可想象的功能;另外,开放性也是Matlab 一个最重要、最受欢迎的特点,除内部函数外,所有Matlab 工具包中主包文件和各包文件都是可读可改的源文件,用户可通过对源文件的修改来形成新的包,
甚至亦可完全由自己编写源文件来构筑自己研究领域的专用包。
在欧美发达国家中,Matlab 已经成为应用线性代数、自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等高级课程的基本教学;成为攻读学位的大学生、硕士生、博士生必须掌握的基本技能;在设计研究单位和工业部门,Matlab 也被广泛地用于研究和解决各种具体工程问题。
Matlab在中国得到充分的重视,在各科研机构和高校中得到大量的使用。
②、 2 利用VC 与MATLAB接口实现matlab程序在VC中的调用
③、(1) 在Matlab 环境中编写. m 文件。
function y =Myfunc (x1 ,x2 ,x3) %x1 用来选择不同的数据处理函数,x2 ,x3 是待处理的数据if x1 = = 1
p = polyfit (x2 ,x3 ,1) ;
a = polyval (p ,x2) ;
plot (x2 ,x3 ,’+ ’,x2 ,a) ;
print (gcf ,’- djpeg’,’杨氏模量. bmp’)
y = (a (8) - a (1) )P(x2 (8) - x2 (1) ) ;
end
(2) 设置Matlab 的编译环境。
在Matlab 环境中运行mex2setup ,按屏幕提示要求选择编译器类型位置等有关信息;然后在Matlab 环境中运行mbuild2setup ,设置方法同上。
(3) 用mcc 将Myfunc. m转换为DLL 文件。
在Matlab 中运行:mcc 2B sgl 2t 2W libhg : dllDB 2Tlink :lib Myfunc. m 编译完成后将生成一批文件,提取其中的三个: dllDB. h、dllDB. lib、dllDB. dll 它们将被添加到VC 中去。
(4) 在VC 中调用DLL 文件进行编译。
首先对VC 的编译环境进行以下设置:
a. 选VC 编译器主菜单下的“”→“选择”,在跳出的对话框中选“目录”签页,并在“路径”列表框中把Matlab 的包含文件路径: (如: E: \ matlab6p5 \ extern\ include) ,库文件路径(如: E: \ matlab6p5 \ extern \lib) 和工作区所在路径(如: E: \ ketishiyan) 添加到VC的编译路径中去。
b. 把dllDB. h、dllDB. lib、dllDB. dll 三个文件复制到工作区所在路径(如:E: \ ketishiyan) 的目录下。
c. 引入头文件和库文件在需要调用DLL 的. cpp 文件的头部加入一行: #include“dllDB. h”,再选“工程”→“设置”,而后在“连接”签页的“对象/ 库模块”下加入:
E: \ matlab6p5 \ extern \ lib \ win32 \ microsoft \msvc60 \ libmat . lib
E: \ matlab6p5 \ extern \ lib \ win32 \ microsoft \msvc60 \ libmatlb. lib
E: \ matlab6p5 \ extern \ lib \ win32 \ microsoft \msvc60 \ libmmfile. lib
E: \ matlab6p5 \ extern \ lib \ win32 \ microsoft \msvc60 \ libmx. lib
E: \ ketishiyan \ ppp. Lib
d. 在需要使用DLL 的. cpp 文件中加入以下,比如下面的是实现待拟合数据的传送和结果接收的接口:
dllDBInitialize () ;
double slope ;
double a[10 ] = {0. 0} ;
double b[10 ] = {2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11} ;
double b1[1 ] = {0. 0} ;
b1[0 ] = double (dllFunctionSelect1) ;
a[0 ] = m- ax0 ;a [ 1 ] = m- ax1 ;a [ 2 ] = m- ax2 ;a [ 3 ]= m- ax3 ;a[4 ] = m- ax4 ;
a[5 ] = m- ax5 ;a [ 6 ] = m- ax6 ;a [ 7 ] = m- ax7 ;a [ 8 ]= m- ax8 ;a[9 ] = m- ax9 ;
mxArray 3 A = mclGetUninitializedArray() ;
mxArray 3 B1 = mclGetUninitializedArray() ;
mxArray 3 B = mclGetUninitializedArray() ;
mxArray 3 C = mclGetUninitializedArray() ;
mlfAssign(&A ,mlfDoubleMatrix(1 ,10 ,a ,NULL) ) ;
mlfAssign(&B ,mlfDoubleMatrix(1 ,10 ,b ,NULL) ) ;
3结论
用VC 调用Matlab 编译的DLL 文件进行复杂数据处理。
实践证明,该模式不仅简洁通用,更具有很强的实用性和可扩展性,在科学计算与工程运用领域具有广泛的推广应用价值。
参考文献:
1飞思科技产品研发中心. Visual C 灵感.
2郝红伟. Matlab 6 实例.
3刘志俭,等. Matlab 应用接口用户指南.
4臧桂鹏,等. Visual C ++中文版新概念百例.
5储开颜,严利民,王朔中. VC 与MATLAB 的接口及其实现。