matlab与vc6.0混合编程成功
- 格式:docx
- 大小:24.29 KB
- 文档页数:3
基于VC与Matlab的混合编程实现图像的三维显示陈翔李进文吴小雅(广州气象卫星地面站广州 510640)摘要本文介绍了VC++与Matlab混合编程的一般实现方法,并实现对二维影像图的三维效果显示。
关键词 VC++ MATLAB M文件三维显示引言通常我们看到的图像是二维状态下的,而在某些特殊领域需要根据三维影像才能做出更进一步的信息抽取,这就需要通过后处理的手段根据原始二维影像虚拟出其三维效果。
MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。
它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。
根据它提供的500多个数学和工程函数,工程技术人员和科学工作者可以在它的集成环境中交互或编程以完成各自的计算。
MATLA具有强大的矩阵运算、数据处理和图形显示功能,其输出结果可视化,编程效率极高,极少的代码即可实现复杂的运行.然而其边解释边执行,运算效率较低,实现相同功能的代码跟其他编程平台相比运行时间相对较长,且不适合作为通用的编程平台。
因此,为系统整体效率考虑,采取具有很高编程效率的通用编程平台VC++与Matlab混合编程的方式,将更有助于发挥Matlab和VC的各自优势。
1 VC++与Matlab几种常用的集成方法 Matlab与VC++混合编程的具体方式有多种,根据Matlab是否运行可大致分为两类:Matlab在后台运行和可以脱离Matlab环境运行。
Matlab 5.0以后版本均自带C/C++编译器,可将其程序文件(M文件)转换为C-MEX或C/C++程序。
第一种方式是Matlab引擎采用客户机/服务器的计算方式,通过Windows的ActivcX通道和Matlab接口。
在具体的应用中,VC的程序作为前端客户机,通过调用Matlab引擎在后台与Matlab服务器建立连接,实现动态通信。
这种方法实现较为简单,不要求连接整个Matlab,只需要嵌入必要的Matlab引擎库,可大大地节省系统资源,但这种Matlab在后台运行,运行效率低下。
引言小波分析世纪80年代开始发展成熟起来的一个数学分支,其应用领域十分广泛,并逐步成为信号分析的又一有力工具。
MATLAB的小波工具箱为我们提供了小波多尺度分解函数,方便了我们对小波的使用。
但是用它所编写的软件不能脱离MATLAB编程环境在W indows平台下直接运行,代码执行效率低下,运行时占较多的系统资源,不能达到某些用户的需求。
VC++是由美国Microsoft 公司开发的可视化C/C++集成编程环境,是目前功能最强大的软件开发工具之一。
被广泛应用于Win32平台的基础应用程序的开发。
它具有强大的图形界面编程能力且代码执行效率高,可生成脱离VC++环境而独立运行的应用程序。
可是VC++在数值处理分析和算法工具等方面不如MATLAB。
本文结合VC++和MATLAB 的各自优点,以VC++图形界面作为前台框架,MAT LAB作为后台进行数值运算和数据可视化,利用组件对象模型(COM)技术作为媒介,实现了一维小波多尺度分解。
1、一维小波多尺度分解原理及其MATLAB实现1.1 一维小波多尺度分解原理以此类推,直到指定级数的多尺度小波分解为止,分解过程如图1示。
图中s为原始信号,cd1,ca1分别为分解后第1层的细节序列和近似序列,cd2,ca2分别为分解后第2层的细节序列和近似序列,以此类推。
因为这种算法分解的数据结构是塔式结构,所以这种算法也常被称为塔式算法(Pyramid Algorithm)。
1.2 一维小波多尺度分解及重构的MATLAB实现MATLAB 小波工具箱提供了以下几个实现一维小波分解和重构的函数[3]:[C,L] = WAVEDEC(X,N,’wname’),多尺度一维小波分解函数。
其中C为分解结构变量,L为个分解结构以及原始信号长度变量,X为原始信号,N为分解层度,’wna me’为小波类型。
X = WAVEREC(C,L,’wname’),多尺度一维小波重构函数。
其中C,L为多尺度一维小波分解函数WAVEDEC的计算结果。
VC与MATLAB混合编程实现方法及具体实例研究夏欣【期刊名称】《青岛理工大学学报》【年(卷),期】2012(033)003【摘要】Vc++与MATLAB混合编程的方法主要有2种类型,一种是在MATLAB中调用VC,另外一种是在VC中调用MATLAB.主要研究VC中调用MATLAB的方法,该类型的方法可以方便快捷地编制需要绘制图形的用户可执行程序.比较了该类型中几种方法的优缺点,并采用VC中调用Matcomc++矩阵库函数方法,给出了一个在VC++6.0和Matcom4.5环境下实现的两者混合编程的实例.%Two kinds of method could realize VC++ and MATLAB hybrid programming. One is calling VC in MATLAB,the other is just on the contrary, calling MATLAB in VC. This article mostly studies calling MATLAB in the VC method, which can realize user exe- cutable program conveniently and quickly. Advantages and disadvantages are compared be- tween these methods, and a hybrid program example in VC++6.0 and Matcom 4. 5 is giv- en, which adopts calling MATLAB C++ matrix in VC method.【总页数】6页(P83-88)【作者】夏欣【作者单位】青岛理工大学理学院,青岛266033【正文语种】中文【中图分类】TP319;TH7【相关文献】1.基于MATCOM转化法的VC与MATLAB混合编程实现汽车I曲线的模拟绘制[J], 任龙辉;肖婵;李腾飞2.VC与Matlab混合编程实现图像处理 [J], 刘子霆;3.基于MATLAB与VC++混合编程实现配电网重构算法 [J], 李国胜;华泽玺;苗轶如4.基于VC与Matlab混合编程实现图像增强处理 [J], 刘大鹏5.VC++与Matlab混合编程实现光场光强的三维显示 [J], 杨入超因版权原因,仅展示原文概要,查看原文内容请购买。
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编程的时候,遇到很多问题,就去百度找解决方法,但发现根本解决不了我的问题,因为网上大部分实例和步骤都是在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 就可以了)。
VC6.0调用MATLAB生成的COM组件作者:彭军邮件:poonjun at gmail com 博客:/pengjun一、在MA TLAB中安装mbuild首先声明我的MA TLAB版本是2008A(相当于7.5版本),不过幸好版本如何改变,安装mbuild的命令没有变化,下面是安装mbuild的全过程:>> mbuild -setupPlease choose your compiler for building standalone MA TLAB applications:Would you like mbuild to locate installed compilers [y]/n? ySelect a compiler:[1] Lcc-win32 C 2.4.1 in D:\MATLAB~1\sys\lcc[2] Microsoft Visual C++ 6.0 in C:\Program Files\Microsoft Visual Studio[0] NoneCompiler: 2Please verify your choices:Compiler: Microsoft Visual C++ 6.0Location: C:\Program Files\Microsoft Visual StudioAre these correct [y]/n? yTrying to update options file: C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R2008a\compopts.batFrom template: D:\MATLAB~1\bin\win32\mbuildopts\msvc60compp.batDone . . .可以看到我的mbuild已经安装完成了,要注意的是mbuild和-setup之间是有一个空格的,不能连在一起。
VC++6.0与MATLAB联合编程实现物理实验数据智能处理王艳萍;杨建宋
【期刊名称】《杭州师范大学学报(自然科学版)》
【年(卷),期】2011(010)003
【摘要】采用VC++6.0和MATLAB混合编程的方法,实现了物理实验数据处理系统的开发.实践表明二者联合编译能大大提高软件开发效率,缩短软件维护周期.【总页数】7页(P268-274)
【作者】王艳萍;杨建宋
【作者单位】杭州师范大学理学院,浙江杭州,310036;杭州师范大学理学院,浙江杭州,310036
【正文语种】中文
【中图分类】TP312
【相关文献】
1.基于Matlab和VC++6.0联合编程的带式输送机动态分析 [J], 牛巍巍;韩刚
2.基于Matlab和VB混合编程实现大学化学实验数据处理系统 [J], 张云鹏;胡飞;马晓燕;马春燕;陆伟
3.基于编程实现物理化学实验数据处理系统 [J], 周建敏;吴政辉;林德裕
4.基于编程实现物理化学实验数据处理系统 [J], 周建敏;吴政辉;林德裕
5.Matlab程序编辑在大学物理实验数据处理中的应用 [J], 范丽琴;张春红
因版权原因,仅展示原文概要,查看原文内容请购买。
VC++6.0与MATLAB混合编程技术的原理与实现
高崇明;邵美珍
【期刊名称】《无线电工程》
【年(卷),期】2000(030)002
【摘要】VC++与MATLAB各处在具有很强的优势。
本文通过对MATLAB的数据管理机制及其提供的engine的深入分析,阐述了VC++开发的应用程序的接口,以及用VC++语言组织数据的要求和方法。
最后,通过举例说明了VC++与MATLAB混合编程实现方法。
【总页数】4页(P53-56)
【作者】高崇明;邵美珍
【作者单位】不详;不详
【正文语种】中文
【中图分类】TP311
【相关文献】
1.小议VC++6.0与Matlab的混合编程技术 [J], 庞琳琳
2.基于面向对象技术的MATLAB6.5与VC++6.0混合编程研究 [J], 艾伟;于树全
3.Matlab与VC混合编程技术与实现 [J], 刘蓉
4.利用MATLAB和VC++6.0混合编程技术研究元胞自动机动态演化过程 [J], 王茂芝;郭科;徐文皙;佘春东;汪红兵
5.对VC++6.0与Matlab的混合编程技术的探讨 [J], 马虹宇
因版权原因,仅展示原文概要,查看原文内容请购买。
VC6.0和MATCOM来开发图像处理程序作者:彭军(心の诚)博客:/pengjun一、软件环境1、MA TLAB安装的版本没有什么限制,可以安装也可以不安装。
但是最好知道一些MA TLAB函数的调用方式和数据类型等,对于你使用MA TCOM有很好的帮助。
2、MA TCOM4.5这个软件可厉害了,可以让你在VC6.0中使用类似与MA TLAB的语句,只是做一些稍微的更改就可以了。
不过,他支持的函数是有限的,可以查看帮助来看支持的文件。
他生成的exe可执行文件可以在没有安装MA TLAB的地方运行,只是需要几个dll文件而已。
如果用MA TLAB的Depolyment Tool来生成的exe可执行文件,在没有安装MA TLAB的机子上运行时需要安装MCR,而MCR现在有200M多,所以很不方便。
3、VC++6.0这个就没什么可说的了,安装就可以了。
注意的是最好选择注册环境变量(Registed Enviroment variables)。
二、MATCOM4.5的安装1、下载地址:/yunbo/matcom4.5.rar2、MA TCOM4.5在安装时需要你输入口令,Matcom4.5的口令为FREE-4.5-1193046-802951113、第一次运行MA TCOM时会有提示是否自动搜索VC6.0的cl.exe,如果你已经安装了VC6.0的话,那么它会自动找到。
这个VC6.0是必须安装的,如果你先安装的MA TCOM,后安装的VC6也没关系,只用安装VC6之后启动MA TCOM就可以了。
然后会提示是否安装了MA TLAB,如果安装了就点“是”,否则就点“否”。
4、如果安装了MA TLAB的话,会有下面的操作:点击“是”之后,启动MA TLAB,输入下面的命令:cd c:\matcom45 % MA Tcom的安装路径diary mpathmatlabpathdiary off用上面的目的是为了让MA TCOM能记录MA TLAB的路径。
matlab与vc混编matlab与vc混编-概述篇--转贴自pris学术论坛第一章、详述...第一章、概述matlab就是当今世界上采用最为广为的数学软件,它具备相当强悍的数值排序、数据处理、系统分析、图形表明,甚至符号运算功能,就是一个完备的数学平台,在这个平台上,你只需寥寥数语就可以顺利完成十分复杂的功能,大大提高了工程分析排序的效率。
另外由于matlab的广为采用,于是发生了向各个领域专门采用的工具箱(即为在某一研究领域常用数学工具的函数纸盒),这些工具箱的发生更加推动了matlab的盛行。
matlab强大的功能只能在它所提供的平台上才能使用,也就是说,你必需在安装有matlab系统的机器上采用.m文件,这样就给工程排序增添了非常大不便;特别就是,在matlab中,并使用的行解释方式执行代码,这样大大地限制了代码执行速度。
于是人们想到,能否开发一个matlab与其他高级语言的USB,这样就可以把matlab的强悍功能带入各种应用程序中,并且通过高级语言编译器编译为2进制代码,从而大大提高了执行速度。
1.用matlab的mcc将.m文件翻译为cpp源文件,然后在c编译器中调用也可以用mcc编程编程为stand-alone程序。
是我最喜欢用的方法。
方法1和2/3各有利弊,1不积极支持图形(积极支持图形的库国内现在还没d),1对类积极支持也比较,2积极支持绝大多数的matlab语句(包含图形),但对于struct等的积极支持也有缺陷。
vc++中使用matlab的c++数学库和mcc生成的程序0、概述matlab5.3的提供了c/c++数学库,其中的c++数学库功能很强,使用它可以用类似matlab的语法编写c++程序,十分方便。
虽然速度上仍然比手工c/c++程序慢,但是由此换来的高效的开发效率和可靠性往往是值得的。
另外mcc命令可以将m文件转化为c或cpp文件,编译后可以脱离matlab运行,它们也是使用的c/c++数学库。
基于com组件的VC和MATLAB混合编程一、MATLAB 下做COM组件由于MATLAB 的编译器只能对函数M文件进行编译, 所以如果原来的程序是脚本程序应改写成函数形式。
同一个M文件还可以包含多个函数, 此时将出现在文件中的第一个M函数称为主函数, 其余的函数称为子函数, M函数文件的名称一般与主函数的名称保持一致, 其它函数都必须按照函数的基本结构来书写, 例如建立一个M函数文件function [a]=msadd(x,y)a=x+y;保存文件名为msadd.m在MA TLAB 命令行中输入deploytool命令启动MATLAB Com Builder 图形用户界面, 在其文件菜单中选择File- >New Project点击最左上角新建一个工程:注意:工程保存路径最好在硬盘一级目录下,工程名尽量简单,不要超过8个字母。
新建一个M3add的工程在D盘下系统生成一个M3add.prj的文件和一个名为M3add的文件夹工程建好后,系统自动生成一个与工程名相同的类,下图中为M3add的文件夹,这个文件夹经编译后,导入VC就是一个类,注意:这里要把与工程名相同的类删除再增加一个不同名的类,或改名,总之工程名与类名不能相同,否则导入VC后,最后编译时会报错,overload 之类的。
这里新增加了一个M4add类,在这个类下面增加m函数文件。
注意:如果是神经网络,则只能是训练好的神经网络。
函数中最好不要用图形显示的语句。
图形显示和VC的交互更加复杂,这里暂不讨论。
然后编译:编译完成后,关闭Matlab。
Matlab的工作到此完成。
二、设置VC++1、准备文件:(1)如果未曾对mwcomutil.dll 进行过注册, 在系统开始->运行中输入cmd,则进入DOS 在Dos状态下输入regsvr32 mwcomutil.dll对其进行注册,mwcomutil.dll在<MA TLAB 目录>/bin/win32 下。
Matlab与Visual C++混合编程学习笔记要实现VC++与matlab的无缝混编,必须充分掌握matlab的C/C++数学库函数和图形库函数,而要运用这两类库函数则必须先熟悉matlab的接口类与接口函数的结构及使用规则。
1 Matlab接口类与接口函数的介绍接口类 mwArray(1) 构造函数mwArray()默认构造函数,通过它用户可以创建一个未初始化的mwArray类对象(阵列)。
mwArray(const char *str)通过该函数可以构造一个字符串型的阵列,并通过输入的字符串指针指向的字符串进行初始化,例如:mwArray A(“MATLAB mwArray string”); mwArray(int32 rows, int32 cols, double *real, double *imag = 0) 通过该函数可以创建一个指定行数、列数、以及实部和虚部数据的二维复数阵列,例如:double real[] = {1, 2, 3, 4, 5};double imag[] = {6, 7, 8, 9, 10};mwArray A(1,5,real,imag);mwArray(const mwArray &mtrx)mwArray(const mxArray *mtrx)mwArray(double start, double step, double stop)mwArray(int32 start, int32 step, int32 stop)mwArray(const mwSubArray & a)mwArray(double)mwArray(int)(2) 索引和下标函数operator ()cell ()field ()(3)转换函数operator double() const(4) 内存管理函数类mwArray对运算符new和delete进行了重载。
matlab compiler与c语言混合编程经过一个多月的努力,在老师的帮助和自己的琢磨之下,终于对vc与matlab的混合编程有所了解。
且举一例。
首先要在自己的matlab7.0上安装MEX和mBuilder,安装方法是在matlab命令窗口中输入mex-setup,按照一系列的步骤安装下去。
然后再在命令窗口中输入mbuilder-setup,同样的方法就可以安装mbuilder。
在matlab中打开一个空的m文件,向里面写下列代码,并将其保存为zhengtaifenbuhanshu.m:function y=zhengtaifenbuhanshu(x,u,d)%x为变量,u为均值,d为方差y=normcdf(x,u,d);我的目的是在c语言中可以调用matlab中的正态分布函数。
这个函数有三个输入参数,一个输出参数。
然后在matlab命令行中打入:mcc -l zhengtaifenbuhanshu.m -o dllnormcdf。
这样就生成c共享(动态)库文件。
其中zhengtaifenbuhanshu.m是要编译的m文件,最后编译的名称为dllnormcdf。
-o表示要编译成的名字,如果没有-o,则编译后生成的文件名是与第一个要编译的文件名一致,就是这里的zhengtaifenbuhanshu。
上面命令的作用是将zhengtaifenbuhanshu.m函数生成名字为dllnormcdf的c语言动态库。
注意编译的路径,如果zhengtaifenbuhanshu是你放在一个matlab中work的一个包中,那么matlab主窗口上面的Current Directory要选择好zhengtaifenbuhanshu.m这个m文件所在的地方。
按回车编译成功后,你会在编译的文件夹(默认的是work中)中看到多了几个生成的文件:dllnormcdf.cdllnormcdf.ctfdllnormcdf.dlldllnormcdf.expdllnormcdf.exportsdllnormcdf.hdllnormcdf.libdllnormcdf_mcc_component_data.c在生成的文件中,dllnormcdf.h文件是编译结果函数库的函数声明头文件,而dllnormcdf.lib文件是最终用户在编译自己的可执行应用程序所必须的库文件,dllnormcdf.dll 文件就是最终用户的可执行应用程序运行时所需要的动态库。
一、目的通过混编方式,可以将Matlab强大的算法仿真运算能力真正运用到工程实际,使得自行开发系统的技术含量得到进一步提升。
混编后可以将基于Matlab开发的算法不编译成VC++程序,进而使得算法的整个运算过程在基于VC++开发的系统中独立运行,便于算法的实际调用。
二、混编所采用的软件推荐使用Microsoft V isual Studio 2005、Matlab R2007a或更高版本,以便使得源文件之间得到最佳的编译效果。
(如果使用VC++6.0请搭配Matlab6.5以便达到最好的兼容性,但具体编译环境配置请自行斟酌。
)三、编译过程1、启动Matlab R2007a,在command window键入:mex –setup(配置. Mexw32文件的编译环境,MatlabHelp中指出.mexw32文件在编译时可以当作.m文件进行引用,后面会有详细介绍)。
键入mex –setup回车后,Matlab显示如下:>> mex -setupPlease choose your compiler for building external interface (MEX) files:Would you like mex to locate installed compilers [y]/n? nSelect a compiler:[1] Borland C++ Compiler (free command line tools) 5.5[2] Borland C++Builder 6.0[3] Borland C++Builder 5.0[4] Compaq V isual Fortran 6.1[5] Compaq V isual Fortran 6.6[6] Intel C++ 9.1 (with Microsoft V isual C++ 2005 linker)[7] Intel Visual Fortran 9.1 (with Microsoft V isual C++ 2005 linker)[8] Intel Visual Fortran 9.0 (with Microsoft V isual C++ 2005 linker)[9] Intel Visual Fortran 9.0 (with Microsoft V isual C++ .NET 2003 linker)[10] Lcc-win32 C 2.4.1[11] Microsoft V isual C++ 6.0[12] Microsoft V isual C++ .NET 2003[13] Microsoft V isual C++ 2005[14] Microsoft V isual C++ 2005 Express Edition[15] Open WA TCOM C++ 1.3[0] NoneCompiler: 13Y our machine has a Microsoft V isual C++ 2005 compiler located atD:\Microsoft Visual Studio 8. Do you want to use this compiler [y]/n? yPlease verify your choices:Compiler: Microsoft V isual C++ 2005Location: D:\Microsoft V isual Studio 8Are these correct?([y]/n): y***************************************************************************Warning: MEX-files generated using Microsoft V isual C++ 2005 requirethat Microsoft V isual Studio 2005 run-time libraries beavailable on the computer they are run on.If you plan to redistribute your MEX-files to other MA TLABusers, be sure that they have the run-time libraries.Y ou can find more information about this at:/support/solutions/data/1-2223MW.html***************************************************************************Trying to update options file: C:\Documents and Settings\Administrator\Application Data\MathWorks\MA TLAB\R2007a\mexopts.batFrom template: D:\MA TLAB~1\bin\win32\mexopts\msvc80opts.batDone . . .其中红色字符为用户选项输入,输入时注意检查VC++编译器目录是否正确。
matlab7.0.1与vc6.0混合编程成功
matlab 2008-01-05 18:11 阅读600 评论0
字号: 大大 中中 小小
混合编程其实不难,关键是没有一个规范的,真正可以解决设置过程中出现的小问题的方法。我在设置的过程中,遇到了不少问题,花了多半天的时间,终于解决
了,顺利地在vc中调用matlab 生成的dll文件中的函数,并返回一个值,探出对话框,显示正确。这种混合编程的方式不能脱离matlab环境,如果需要发布独立的应用程
序,需要安装MCR。下面分步骤地讲一下混合编程的设置及其原因:
1 matlab方面的操作
首先先写一个算阶乘的函数,存成test1.m文件,该文件的内容是:
function y = test1(n)
y = 1 ;
for i = 1 : n
y = y * i ;
end
现在有了文件,下一步我们要设置好系统,设置好matlab,然后再把该文件编译成dll文件。
1、在环境变量(我的电脑右键-高级)path中加入
2、添加环境变量matlab值设为< MATLAB71_root >即matlab7.1的安装路径;
3、配置mbuild使用的C/C++编译器;
在Matlab命令窗口中输入:
mbuild -setup
按照提示选择VC6.0的编译器,完成后在Matlab命令窗口中输入:
mex -setup
同样选择VC6.0的编译器,就完成编译器的安装和配置。
接下来我们要把.m文件存储的程序编译成dll文件,在matlab命令窗口中输入:
mcc -W lib:test1 -T link:lib test1.m
这个需要等一小段时间,最终,在当前目录下生成了
到此,在操作系统和matlab这一方面的工作就做完了
2 vc++6.0中的操作
在vc中建立一个MFC AppWizard[exe]基本对话框工程,名字叫做test1app.
1 )在 VC 中创建一个 MFC 工程(本人创建的为基于对话框的),环境设置根据如下帖子
: 怎样设置 Visual Studio 与 Matlb Complier 4.0 一起工作 中的指导进行。在
本例子中,只需要在 VC 中进行如下步骤:
A. Tools->Options->Directories->Show directories for : Include files->
B. Tools->Options->Directories->Show directories for : Library files->
C. Project->Setting->C/C++->Category : Code Generation->Use run-time library
: Debug Multithread DLL ;
D. Project->Setting->Link->Category : Input->Object/library modules : test1.lib mclmcr.lib libmx.lib libmat.lib libeng.lib
2 )拷贝 MATLAB 当前目录下刚才用 mcc 生成的 test1.h , test1.dll , test1.lib ,以及 test1.ctf 文件到 VC 当前工程目录下,并
用 Project->Add to Project->Files… 将 test1.h 加入到当前工程中。
3 )在当前工程的对话框的头文件和cpp中加入 #include "test1.h" 与 #include "mclmcr.h" ;
工程设置到此就结束了,下面开始写代码:
首先需要在对话框的初始化程序BOOL CTest1appDlg::OnInitDialog()内写
if( !mclInitializeApplication(NULL,0) ) //matlab环境初始化
{
AfxMessageBox( "Could not initialize the application.");
exit(1);
}
/* Call the library intialization routine and make sure that the
* library was initialized properly. */
if (!test1Initialize()) //test1Initialize是test1.h中定义的test1函数的初始化函数
{
AfxMessageBox("Could not initialize the library.");
exit(1);
}
在对话框的确定按钮的消息响应函数内,调用dll中的阶乘函数,
void CTest1appDlg::OnOK()
{
// TODO: Add extra validation here
//此处为dll中的函数准备好参数,然后调用
double n = 4 ;
mxArray * t; //经过matlab编译完的dll 中的函数只能识别mxArray 类型的参数,所以我们在vc中定义的数值
//都需要转换成该种格式
t = mxCreateDoubleMatrix( 1 , 1 ,mxREAL);//该函数中的参数1,1定义了 t 这个矩阵的大小
memcpy(mxGetPr(t), & n, sizeof ( double ));//给 t 赋值为4
mxArray * y; //准备一个接收返回值的变量
y = mxCreateDoubleMatrix( 1 , 1 ,mxREAL);
mlfTest1(1,&y,t); //运行该函数,进行阶乘计算,4的
double r1 = 0; //vc中的接收返回值的函数
memcpy(&r1,mxGetPr(y),sizeof(double));
mxDestroyArray(t); //销毁废弃内存
test1Terminate();//中止调用
CString showrslt;
showrslt.Format("%f",r1);
AfxMessageBox(showrslt);//显示阶乘计算的结果
CDialog::OnOK();
}
mxDestroyArray(t); //销毁废弃内存
test1Terminate();//中止调用
CString showrslt;
showrslt.Format("%f",r1);
AfxMessageBox(showrslt);//显示阶乘计算的结果
CDialog::OnOK();
}