当前位置:文档之家› 用MATCOM实现VC对MATLAB中m文件的调用

用MATCOM实现VC对MATLAB中m文件的调用

用MATCOM实现VC对MATLAB中m文件的调用
用MATCOM实现VC对MATLAB中m文件的调用

Vc++6.0调用matlab的数学库函数

Vc++6.0调用matlab的数学库函数 前段时间在摸索如何在VC++6.0当中调用Matlab的里的数学库函数。当时弄得我很是郁闷,现在想想,自已走了很多弯路,原来,是如些的简单。所以,与出来和大家一起讨论和分享。 一、关于Matlab6.x 首先,matlab它本身也是用C++语言编写的,具是什么是编译器我倒是忘记了(好像是Borland吧)。说Matlab是一种科学计算语言吧,其实也可以,不过,其实也可以把它看作是一个科学计算软件。它里面有很多的已写好的数值计算、分析以及统计等的函数。然后在Matlab里写文件(比如.m文件),文件里的每一个语句其实都是在调用它里面的函数。说白了,Matlab就是为我们写了一大堆的数学运算函数,然后再能过文档(help指令)来告诉我们怎么调用这些函数,就是这样。 其次,为什么要选择Matlab的6.x版?现在最新的版本好像是7.x了吧,照理说,就应该用最新版的。可是,最新版的Matlab(7.x)不再把数学库公共了,如果想要调用它里面的函数库,就必须将Matlab在后台运行。也就是说,不管你用什么语言,只要你想调用Matlab7.x里面的函数,那么你的程序就必须在Matlab运行环境下运行。哦,刚才忘记说了,这篇日志的目的是要建立独立于Matlab 运行环境的程序。

最后,Matlab6.x已推出七八年了,会不会和7.x版本相比而有点过时了?我是这样理解的,如果你调用的函数不是一些当前数值计算领域的新兴问题,那就是没有问题的。对于我们工科的人来说,10年前的伟大的mathworks公司绝对可以提供我们想要的计算方法了。所以,6.x,没问题。 二、关于C++和Matlab混合编程 关于这个主题的文章是非常之多的,足以让你眼花缭乱了。更让我感到不解的是,有好多人居中然以C++和Matlab混合编程为主题,在正式期刊上发表文章。不信你可以在知网或万方上搜搜看,呵呵,一大把。不过,我还是要感谢这些文章啊,因为这些文章让我理解了什么是“灌水”。 所谓的C++和Matlab混合编程大概是指这样的一个过程: 1)在Matlab里写.m文件,当然,这种文件中除了函数好像就没有别的什么了。 2)在Matlab里的命令行中使用mcc命令生成C/C++代码。当然,还可以直接生成.dll和.lib,这里的.dll和.lib都是C的,不能生成C++的动态链接库(反正文档里是这么说的)。 3)在C/C++编译器中嵌入生成的C/C++源码,或调用生成的.dll。 我说,何必这么麻烦呢?

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

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.lib libmex.lib libmmfile.lib libmwarpack.lib libmwlapack.lib libmwmcl.lib libmwrefblas.lib libmwservices.lib libmwsglm.lib libmx.lib libut.lib mclcommain.lib sgl.lib (4)最后在编写程序时加入这么一句预编译语句#include 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]None Compiler:2 ●Please verify your choices: Compiler:Microsoft Visual C/C++6.0 Location:C:\Program Files\Microsoft Visual Studio Are these correct?([y]/n):y ●Try to update options file:C:\Documents and Settings\Administrator\Application

VC++与Matlab混合编程之引擎操作详解

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控件方式启动的。在Matl ab初次安装时,会自动执行一次: matlab /regserver 将自己在系统的控件库中注册。如果因为特殊原因,无法打开Matlab引擎,可以在Do s命令提示符后执行上述命令,重新注册。 2. 配置编译器 要在VC中成功编译Matlab引擎程序,必须包含引擎头文件engine.h并引入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 中被引用

VC++与MATLAB混合编程

VC++与MATLAB混合编程及其应用 摘要本文详述了在VC++6.0编译环境下如何利用Matlab来实现应用系统的设计和分析,介绍了通过Matlab与VC应用程序连接的常用方法,分析了VC与Matlab的混合编程的步骤,最后通过一个具体实例的实现过程对上述方法进行了应用性介绍。 关键词 VC++;Matlab;混合编程 Matlab 是由Math Works 公司于1984 年推出的数值计算及图形处理软件,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、图像处理等若干领域的计算和图形显示功能。其中,控制系统工具箱的集成为设计和分析各种复杂的控制系统提供了有效的方法和途径。 但是,由于Matlab开发平台的局限性,在其上面开发的程序不能脱离Matlab运行环境,因而在处理一些实际应用问题时显得灵活性不足,而VC++则在一定程度上能够弥补这一漏洞,因此,现将二者结合共用,各献其长,可以为科研工作和工程开发提供了更为强大的技术支持。 1、Matlab与VC混合编程的实现方法 Matlab作为控制系统设计的一种通用工具,它可以和VC方便的进行连接。一般而言,Matlab与VC混合编程的实现方法主要有以下三种方法: (1)通过引擎(Engine),采用客户机服务器的计算模式,通过Window的ActiveX通道和Matlab进行连接。具体应用时,往往在VC中设计程序框架,以编译的程序作为前端客户机;通过调用Matlab引擎在后台实现与服务器的连接,实现动态通信。 (2)应用Matlab数学函数库,Matlab中包含了内容丰富的函数库,而且还提供了与VC的数学函数接口,用户可以方便的在VC的IDE(集成开发环境)中调用。 (3)通过DLL实现VC与Matlab的混合编程。DLL是一个可执行的二进制文件。把很多通用的功能放在DLL中,可以供多个应用程序调用,这样可以很好的减少外部存储空间的占有量,并实现代码的共享[2]。 在上述三种方法中,第一种方法对调用Matlab的工具箱很实用,所有在进行控制系统的设计和分析时,一般都是通过调用Matlab引擎(Engine)来实现的。本文主要介绍采用通过引擎(Engine)来实现VC与Matlab的混合编程。

基于VC++和MATLAB混合编程绘制三维图形

?30-电脑与信息技术2008年2月 本例中用到的数据minx=-4,maxx=4,rainy=一4,maxy=4,所得图形如图3所示: 圈3利用MATLAB编译器绘图结果 2.2MATLAB引擎 从编程复杂度的角度来说,最简单的途径就当属利用MATLAB的引擎功能闭。与其它各种接口方式相比,引擎所提供的MATLAB功能支持是最全面的。2.2.1VC环境设置 用MFCAppWizard(exe)建立一个应用程序,并作如下设置: (1)通过菜单Tools/Options…,打开设置属性页,进入Directories页面,在目录下拉列表框中选择Includefiles,添加路径D:WIATLAB6p5\extem\include再在下拉框中选择Libraryfiles,添加路径D:、MA’ILAB6p5、extenluib\win32\IIlicrosofc\lIlsvc60 (2)选择菜单Project/Settings…,打开工程设置属性页,进入Link页面,在Object/librarymodules编辑框中,添加文件名libmx.1iblibmat.1iblibeng.1ib,以空格隔开。2.2.2VC++中程序说明 调用命令engOpen打开引擎,然后将mxArray转换成在MATLAB中可操作的形式。具体方法是:在MATLAB中将一个自定义的数据结构复制到mx.Array中,后将此矩阵放人MATLAB计算引擎的工作区中,把命令以字符串的形式传递给函数engEvalString进行执行。使用引擎,计算程序中必须添加头文件#include“en6ne.h”,程序开始后需要打开引擎,运算完成后要释放内存并关闭引擎。 本例绘制的是一个TIG焊焊接质量神经网络中输出背面熔深(BackWidth)与两个输入参数电流Cur-rent)、清洁度(Cleaning)之间的变化曲线。已知两个输入参数的最小值与最大值(minx=80,maxx=100,miny=30,maxy=60),采样个数取为50,即共有51个数。X【5H,y【51】中存储了采样后的两个输入变量值,数组matdatai]中存储的是其余参数不变时,电流每变化1次,清洁度变化51次后,神经网络运算出的背面熔深的结果。 主要程序代码部分: 倒建矩阵并命名赋值 mxmatdata=mxCreateDoubleMatrix(51,51,mxREAL); xx=mxCreateDoubleMatrix(51,1,mxREAL); yy=mxCreateDoubleMatrix(51,1,mxREAL); memcpy(mxGetPr(mxmatdata),matdata,51451。sizeddou-ble)); memcpy(mxGet_Pr(xx),x,51*sizeof(double)); memcpy(mxGetPr(yy),Y,51*sizeof(double)); 鸺变量写到matlab工作空间并命名 ensPutVariable(ep,"mxmatdata”,atxmatdata); engPutVariable(ep,"】【】【”,xx); ell【gPutVariable(ep,"yy”,yy). engEvaIString(ep,"【)【,Y]=meshgrid(xx,)ry);”); en#valString(ep,"mesh(X,Y,mxmatdata);”); 程序运行后得到的图形如图4所示: 图4利用MAlrIAB引擎绘图结果 3结论 本文通过两个实例把VC++与MATLAB的数值计算、图形显示功能进行了结合,既保持了VC++的良好用户界面和高执行效率,又保持了MATLAB的优良算法,使VC++和MArlLAB各自的优势能够得到充分发挥。当VC与MATLAB互传的参数比较简单或无参数传递时,使用MATLAB编译器实现相对简单方便,且可以脱离MATLAB环境运行,但图形不方便存储;当需要互传大量数据,则使用MATLAB引擎更容易实现,图形方便存储,但不能脱离MATLAB环境。 参考文献: 【l】1李天昀,葛临东.综述MATI.AB与vc++的交互编程叽计算机仿真,2004,21(9):193—196. 【2】何强,何英.MATLAB扩展编程[MI.北京:清华大学出版社,2002.【31柏晟.VC++与MATLAB混合编程的方法研究与实现忉.电脑开发与应用,2006,19(4):24-27. 【4】潘爱民,王国印.Visualc++技术内幕【M】.北京:清华大学出版社,1998. 【51飞思科技产品研发中心.MATLAB6.5应用接口编程【M】.北京:电子工业出版社。2003. 【61周灵.基于COM的vC调用Madab的方法及实现【J】.中国科技信息,2006,24:131—133. 忉张志涌.精通MATLAB6.5版【明.北京:北京航空航天大学出版社,2003. 18】张威.MATLAB外部接121编程【M】.西安:西安电子科技大学出版社。 2004.

Matlab调用VC生成的dll的具体步骤

Matlab调用C生成的dll的具体步骤一、C生成dll文件(以vs2008为例) 1创建项目: Win32->Win32项目,名称:MyDLL

2新建头文件testdll.h,并编写相关程序 注:一定要注意头文件的写法,此法是支持C的头文件,Matlab调用DLL只支持用C 语法写成的DLL,C++的一些关键特性如类、继承等都不支持,用起来的话局限性很大的,还不如单独再用M文件把算法再写一遍进行仿真呢。

具体程序如下 #ifndef MATLABDLLTEST_H #define MATLABDLLTEST_H #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) double add(double x, double y); #ifdef __cplusplus } #endif #endif 3新建源文件testdll.cpp,并编写相关程序

具体程序如下所示: #include "stdafx.h" #include "testdll.h" double add(double x, double y) { return (x+y); } 4新建模块定义文件mydll.def,并编写相关程序

二、Matlab调用生成的dll 1、编译器准备 1)在Matlab的命令窗口输入:mex -setup

2)选择你的编译器,我的是: [2] Microsoft Visual C++ 2008 SP1 in c:\Program Files\Microsoft Visual Studio 9.0 2、加载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 %执行此命令后会生成如下窗口

Matlab程序在VC中的调用

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 的编译环境。

VC++与MATLAB混合编程COM组件法

COM 是component object module 的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用它。matlab6.5 新推出来的combuilder 就是把用matlab 编写的程序做成com 组件,供其他语言调用。该方法实现简单,通用性强,而且几乎可以使用Matlab 的任何函数(注意:不支持脚本文件,脚本文件使用时要改为函数文件),因此在程序较大、调用工具箱函数或调用函数较多时推荐使用,这也是Matlab 公司(Matlab 公司就是Mathworks公司)推荐的使用方法。 COM(Compponent ObjectModel 组件对象模型)是一项比较复杂的技术,详细讲的话几本书也讲不完,所以在这里不作介绍,本文通过一个例子详细介绍如何在matlab 下做COM 组件,以及如何在VC 中调用COM 组件。 首先在Matlab 编辑器里编辑m 函数文件:启动matlab->File->New->M-file 函数内容如图1:该函数无输入输出参数,文件保存为huatu.m。 function huatu() x=-10:0.1:10; y=sin(x); plot(x,y); 在matlab 下建立COM 组件,步骤如下: 1、在matlab command window 输入如下命令: >> deploytool 出现以下界面:

2、新建工程:File->New Deployment Project;弹出选择对话框如下图 3、左侧选择Matlab Builder NE,右侧选择Generic COM Component; 4、Name中输入工程名(比如hello4.prj);单击OK;出现下面界面 5、右击hello4选择rename class可以改为合适的类名(比如huatu,这里没改); 6、右击hello4class选择add file添加huatu.m文件(必须是函数文件);添加后如下图

使用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这个路径,但是我用

vc调用matlab工具箱实例

本文详述了在Vc环境下如何利用Matlab工具箱进行数字信号处理,全文以Matlab工具箱中功率谱密度分析函数为例,介绍了通过Matlab自带的引擎、Matlab自身的编译器以及利用MathTools公司的Matcom进行对工具箱函数的调用。 关键词:Matlab M-文件引擎编译器Matcom Vc++ Matlab的信号处理工具箱是信号算法文件的集合,它处理的基本对象是信号与系统,信号处理工具箱位于目录、Toolbox\Signal下,利用工具箱中的文件可以实现信号的变换、滤波、谱估计、滤波器设计等。在其它的环境如Vc下如果能调用Matlab工具箱中的文件,会大大地加快一些算法的实现,同时其可靠性也很高。 1. 利用 Matlab引擎 Matlab引擎采用客户和服务器计算方式,在运用中,Vc的C 语言或C++语言的程序作为前端客户机,它向Matlab引擎传递命令和数据信息,并从Matlab引擎接收数据信息,它提供了下列几个函数:engOpen, engGetArray, engPutArray, engEvaString, engOutputBuffer ,engClose与客户机进行交互。

下面例程是在Vc下建一个基于对话框的应用程序,在对话框中设置一个Button控件OnMatlabEngine.,在对话框.cpp文件中加入”engine.h”和“math.h”头文件,下面给出部分程序清单。 Void CtestmatlabDlg::OnMatlabEngine(){ Engine *ep; mxArray* T=NULL,*result=NULL,*mFs=NULL,*mnfft= NULL; double datax[1024]; char buffer[1024]; for(int j=0;j<1024;j++)//注:如通过采集卡采集数据可将采集的数据放在datax[]数组中,此循环就不需要 { double samt=(double)(1.0/1024);

VC++调用matlab引擎方法设置(个人总结)

VC++调用matlab引擎找不到dll问题 最近尝试在Win7系统下,用VC++6.0调用MatlabR2010a引擎,正常配置后发现程序能够正常编译,但运行时报错如下,说找不到libmx.dll,网上查发现有不少人遇到这样的问题,有人说系统、软件都太新了,难免出问题,倒是有人提议系统变量路径配置不正确,尝试下确实可以。 下面把整个设置过程讲下: 要在VC中成功编译Matlab引擎程序,必须包含引擎头文件engine.h并引入Matlab对应的库文件libmx.lib、libmat.lib、libeng.lib。具体的说,打开一个工程后,做如下设置: 1) 通过菜单工具/选项,打开选项页,点击项目和解决方案,然后在页面右面“显示以下内容的目录”下拉列表框中选择“包含文件”,添加路径:"D:\Program files\MATLAB\R2010a\extern\include"。 2) 选择“库文件”,添加路径:d:\Program Files\MATLAB\R2010a\extern\lib\win32\microsoft。

以上步骤1)、2)只需设置一次,因为是对VC++6.0整体工作环境的设置。 3) 右击工程/属性,打开项目属性页,选择链接器/输入,在附加依赖项编辑框中,添加文件名libmx.lib libmat.lib libeng.lib libmex.lib,中间用空格隔开。

步骤3)对每个项目都要单独设定。另外有一种比较简单的方法,可以自动加载lib库文件,在工程的stdafx.h中写入以下语句: //自动连接Matlab库函数 #pragma comment(lib,"libeng.lib") #pragma comment(lib,"libmx.lib") #pragma comment(lib,"libmex.lib") #pragma comment(lib,"libmat.lib") 4) 如此设置后,能够正常编译,但运行时报错还说找不到dll文件,如下 而libmx.dll是存在于D:\Program Files\MATLAB\R2010a\bin\win32文件夹中,而在Win7系统变量里Matlab在安装的时候时只写入了路径D:\Program Files\MATLAB\R2010a\bin,故系统不会自动到其子文件中找dll,从而报错说找不到文件,这也解释了为什么旧版本的Matlab 无此问题,因为可能旧版本的Matlab中没有将这些dll分离放到win32子文件夹中。所以只要在系统变量中包含路径D:\Program Files\MATLAB\R2010a\bin\win32即可,右击我的电脑选择属性\高级系统设置\环境变量\选择系统变量的新建如下图。

vc6.0调用matlab程序

首先要在自己的matlab7.0上安装MEX和mBuilder,安装方法是在matlab命令窗口中输入mex-setup,按照一系列的步骤安装下去。然后再在命令窗口中输入mbuilder-setup,同样的方法就可以安装mbuilder。 打开一个空m文件,向里面写一个函数如下 function z= huatu(); fid = fopen('b.txt');%打开空文件 [A,count] = fscanf(fid,'%d',inf);%向空文件里读数据 fclose(fid);%关闭txt文件 z = sin(A); fid = fopen('xxx.txt','w');%打开一个txt文件,向里面读数据 for i=1:3 fprintf(fid,'%d ',z(i)); end fclose(fid); 然后将其用m文件的格式保存。随后在matlab7.0的命令窗口打入命令mcc -W cpplib:dllname -T link:lib filename.m 其中filename.m是刚才保存的那个m的文件名,dllname是要生成的新文件的dll文件名,这个自己可以随便取名,我们将上述的程序设为mcc -W cpplib:dllhuatu -T link:lib a.m。回车后会在matlab的work目录下生成一些列的文件,我们只要其中四个文件:dllname.dll, dllname.ctf, dllname.lib, dllname.h 是我们需要的。 在vc6.0中新建一个工程,并新建打开一个c++ source file。向其中写入一个c代码,这是测试刚才在matlab中写的函数 #include #include "dllhuatu.h" #include "mclmcr.h" main(){ mclInitializeApplication(NULL,0); dllhuatuInitialize(); mwArray MA(1,1, mxDOUBLE_CLASS); huatu(0,MA); dllhuatuTerminate(); mclTerminateApplication(); } 编译,运行之前,需要进行一下设置。把在matlab中work下的那个四个文件dllhuatu.dll, dllhuatu.ctf, dllhuatu.lib, dllhuatu.h拷贝到vc6.0新建的工程目录下,并将dllhuatu.h添加到头文件列表中。 在vc菜单Tools→Options→Directories→Show directories for: include files添加 \Extern\include. 再在Tools→Options→Directories→Show directories for: Library添加 \Extern\Lib\Win32\Microsoft\msvc60 经过上面的设置后。下面添加静态库lib文件与头文件,添加方法如下Project→Setting→Link →Category: input→Object/library modules 添加mclmcrrt.lib dllhuatu.lib 这样Vc6.0和matlab7.0的连接就基本上成功了,再有就是在c代码中的头文件添加

VC++与Matlab混合编程之引擎操作详解(2)引擎API详解

3. 引擎API详解 在调用Matlab引擎之前,首先应在相关文件中加入一行:#include "enging.h",该文件包含了引擎API函数的说明和所需数据结构的定义。可以在VC中调用的引擎函数分别如下: 3.1 引擎的打开和关闭 engOpen-打开Matlab engine 函数声明: Engine *engOpen(const char *startcmd); 参数startcmd是用来启动Matlab引擎的字符串参数,在Windows操作系统中只能为NULL。 函数返回值是一个Engine类型的指针,它是在engine.h中定义的engine数据结构。 EngClose-关闭Matlab 引擎 函数声明: int engClose(Engine *ep); 参数ep代表要被关闭的引擎指针。 函数返回值为0表示关闭成功,返回1表示发生错误。 例如,通常用来打开/关闭Matlab引擎的代码如下: Engine *ep; //定义Matlab引擎指针。 if (!(ep=engOpen(NULL))) //测试是否启动Matlab引擎成功。 { MessageBox("Can't start Matlab engine!" ); exit(1); } . ………… engClose(ep); //关闭Matlab引擎。 3.2 向Matlab发送命令字符串 engEvalString-发送命令让Matlab执行。 函数声明: int engEvalString(Engine *ep, Const char *string); 参数ep为函数engOpen返回的引擎指针,字符串string为要matlab执行的命令。函数返回值为0表示成功执行,返回1说明执行失败(如命令不能被Matlab正确解释或Matlab引擎已经关闭了)。 3.3 获取Matlab命令窗口的输出 要在VC中获得函数engEvalString发送的命令字符串被Matlab执行后在matlab 窗口中的输出,可以调用engOUtputBuffer函数。 函数声明: int engOutputBuffer(Engine *ep, char *p, int n); 参数ep为Matlab引擎指针,p为用来保存输出结构的缓冲区,n为最大保存的字符个数,通常就是缓冲区p的大小。该函数执行后,接下来的engEvalString 函数所引起的命令行输出结果会在缓冲区p中保存。如果要停止保存,只需调用代码:engOutputBuffer(ep, NULL, 0)。 3.4 读写Matlab数据 3.4.1从Matlab引擎工作空间中获取变量。

VC和Matlab混合编程

VC和Matlab混合编程 VC调用Matlab的方法有多种,为了对混合编程有一个大概认识,将常用的几种方法中介绍一下: 一、通过Matlab Engine方式 Matlab Engine是指一组Matlab提供的接口函数,支持C语言,Matlab Engine采用C/S(客户机/服务器)模式,Matlab作为后台服务器,而C程序作为前台客户机,通过Windows的动态控件与服务器通信,向Matlab Engine传递命令和数据信息,从Matlab Engine接受数据信息。用户可以在前台应用程序中调用这些接口函数,实现对Matlab Engine的控制。采用这种方法几乎能利用Matlab全部功能,但是需要在机器上安装Matlab软件,而且执行效率低,因此在实际应用中不采用这种方法,在软件开发中也不可行,我认为适合个人使用或做演示用,因此不打算介绍。 二、直接调用Matlab的C/C++数学函数库 Matlab中提供了可以供C/C++语言调用的C/C++数学函数库,其中包含了大量用C\C++语言重新编写的Matlab数学函数,这些函数涉及到线形代数、数值分析、傅立叶变换、多项式计算、解微分方程等,并且函数库中提供了大量各种矩阵操作函数,在VC中可以直接使用这些函数,通过这些函数可以在VC中方便的实现在Matlab中矩阵运算功能。可以看出用这种方法可以很灵活的调用Matlab来编写应用程序,但要求读者对C\C++语言比较熟悉,可以看出使用这种方法调用Matlab的工具箱函数有很大困难。适合对C\C++语言比较熟悉的用户使用。 三、用Matlab自带的Matlab Compiler Matlab Compiler的作用是将m文件转化成C/C++代码(也就是通常所用的mcc命令),这种源代码需要用C/C++编译器编译连接成独立应用程序,在将m文件转成独立应用程序的过程中生成的C/C++文件,原则上是可以被其它的C/C++代码调用的,编译器可以通过设置mcc命令的选项,将m文件编译成动态链接库文件、C/C++文件、可执行文件等一系列文件。到matlab R21.1为止,Matlab Compiler的m程序转换成C/C++代码功能有很多限制: 1. 不能转换脚本m文件,只能转换m函数; 2. 不能使用matlab对象; 3. 不能用input或者eval操作matlab空间变量;

一步步学如何使用VC调用matlabengine编程

一步步学如何使用VC调用matlab engine编程 作者:bugzhao 山东大学信息学院 这里不再介绍VC和matlab的各自优劣。直接给出一个最简单的例子。跟着文中步骤一步步来做,肯定会成功的。 废话少说。 Matlab Engine 采用Client/Server的方式,通过ActivcX通道和Matlab接口来实现在VC编程环境中直接调用matlab中的指令。调用使用的函数是:engEvalSting。后面将讲到此函数的使用方法。 下面是完整的步骤。如果是第一次使用,则要设置一下VC的编程环境中的include和lib的路径指向。假设matlab安装在c盘默认目录,则如下设置: 注意:上面添加路径的两步只设置一次就可以了。下面来进行VC编程。

首先,运行VC向导,新建一个工程文件如下: 接下来选择一个对话框程序作为简单示例: 点击”Finish”可以完成自动生成一个工程框架。 下面来设计界面,我们来简单的添加一个按钮并为其添加响应函数: 生成的按钮响应函数: void CVc_matlab_engineDlg::OnButton1()

{ } 好了至此VC部分框架已经搭好。下面来进入调用engine部分。 在编写函数调用engine之前,首先要设置一下链接库(每个工程都要设置一次的,而前面的路径设置不必)。 在Object\Library modules文本框中添加: libmx.lib libmat.lib libeng.lib 接下来,在StdAfx.h 文件头中加入: #include "engine.h" 并在按钮响应函数中输入: void CVc_matlab_engineDlg::OnButton1() { Engine *ep; if(!(ep=engOpen(NULL))) ::MessageBox(NULL,"Can' start the MATLAB engine","VC调用matlab engine示例程序",MB_OK); engEvalString(ep,"x=0:0.05:2*pi;y=sin(x);"); engEvalString(ep,"subplot(2,1,1);plot(x,y);"); engEvalString(ep,"title('画正弦线');"); engEvalString(ep,"subplot(2,1,2);load clown;imshow(X,map);title('显示matlab自带小丑图像')"); ::MessageBox(NULL,"俺任意键继续","VC调用matlab engine示例程序by bugzhao",MB_OK); engClose(ep);

相关主题
文本预览
相关文档 最新文档