《MATLAB编译功能学习小结.doc》由会员分享,可在线阅读,更多相关《MATLAB编译功能学习小结.doc(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、由于时间仓促,简单地学习了如何将.m文件打包为.exe文件首先介绍一下MATLAB编译器MATLAB编译器功能1、产生C源码,并进而生成MEX文件。这种MEX文件的优点是:一,当程序变量为实数,或向量化程度较低,或含有循环结构时,采用该法可提高运行速度;二,与ASCII码的M文件不同,MEX文件采用二进制代码生成,能更好地隐藏文件算法,使之免遭非法修改。2、产生C或C+源码,以便与其他C/C+模块结合行成独立的外部应用程序。运行所产生的应用程序,无需MATLAB环境的支持,但是往往需要MATLAB提供的C/C+数学库;如果调用了MATLAB绘图指令,则还需要MATLAB提供的C/C+图形库3、
2、产生CMEX的S函数,与Simulink配合使用,以提高S-函数的运行速度4、产生C共享库(动态链接库)或C+静态库,他们的使用无需MATLAB环境的支撑,但是需要MATLAB的数学库局限性1、无法编译脚本文件2、不支持用户自定义对象3、不支持eval,input,inline等函数4、不支持的MATLAB的Java接口脚本文件改写为函数文件M脚本文件不能直接被MATLAB编译器所编译,解决方案:先把脚本M文件改写成函数M文件,然后再对这函数文件进行编译。下面通过举例进行阐述例:有一个绘图的M脚本文件circle.m如下。希望获得一个MEX绘图程序,(1) 原始的绘图脚本文件circle.mc
3、lf;r=2;t=0;pi/100:2*pi;x=r*exp(i*t);plot(x,r*);axis(square);(2)对这些脚本文件直接编译将因错误而失败mcc-xcircle?Error:FilecircleisascriptM-fileandcannotbecompiledwiththecurrentCompiler.Errorin=C:MATLAB6p5p1toolboxcompilermcc.dll(3)把脚本文件改写成函数文件改写方法之一:在原始脚本文件最前面,加一行functioncircle_f(r).具体如下:circle_f.mfunctioncircle_f(r)c
4、lf;r=2;t=0;pi/100:2*pi;x=r*exp(i*t);plot(x,r*);axis(square);(4)再对circle_f.m进行编译,将顺利进行通过mccxcircle%mcc是编译指令(5)运行生成的MEX文件circle_f.dllcircle_f(0.5)%调用circle_f绘制一半径为0.5的圆whichcircle_f%查询所调用的circle_f路径全称下面介绍一下编译器的配置为产生的MEX文件进行预配置1、 对MATLAB编译器应用程序mex的设置在MATLAB命令窗中运行mexsetup2、 配置正确性的验证验证分两步:第一步,验证mex应用程序;第
5、二步,验证mcc应用程序。验证中原始文件取自MATLAB。这样可避免因原始文件不当,而造成验证失败。(1) mex应用程序的验证本过程主要验证mex能否正确地将C码文件转换为MEX文件步骤如下:先将externexamplesmex目录下的yprime.c文件复制到用户自己的工作目录(比方d:mywork),然后将此文件名改为:my_yprime.c在MATLAB指令窗中运行以下指令cdd:mywork%把用户目录指定为当前目录mexmy_yprime.c%由my_yprime.c文件生成my_yprime.dll文件my_yprime(1,1:4)%运行my_yprime.dll文件whic
6、hmy_yprime%获得my_yprime.dll文件的位置信息ans=2.00008.96854.0000-1.0947d:myworkmy_yprime.dll(2) 在MATLAB命令窗中验证mcc应用程序先将externexamplesmex目录下的yprime.c文件复制到用户自己的工作目录(比方d:mywork),然后将此文件名改为:my_yprime_m.c在MATLAB指令窗中运行以下指令mcc-xmy_yprime_m%my_yprime_m(1,1:4)whichmy_yprime_mans=2.00008.96854.0000-1.0947d:myworkmy_ypri
7、me_m.dll(3)在DOS提示符后验证mex、mcc应用程序为产生独立外部应用程序进行配置要实现从M文件到独立外部应用程序的转换,也必须先对MATLAB编译器进行正确的设置。预配置包括两个过程:第一,根据外部编译器的类型、软件位置对MATLAB编译器进行设置,同时对MATLABC数学函数库进行选择;第二,利用MATLAB提供的标准文件对用户设置加以验证。1、 对MATLAB编译器mbuild应用程序的设置在MATLAB命令窗口运行mbuildsetup2、 配置正确性的验证验证分两步:第一步,验证mbuild应用程序第二步,验证mcc应用程序(1) mbuild应用程序的验证先将exter
8、nexamplescmath目下的ex1.c文件复制到用户自己的工作目录,然后将此文件名改为my_ex1.c在MATLAB指令窗中运行以下指令cdd:mywork%把用户目录指定为当前目录mbuildmy_ex1.c%在d:mywork下生成my_ex1.exe文件(2) mcc应用程序的验证先将externexamplescmath目下的hello.c文件复制到用户自己的工作目录,然后将此文件名改为my_hello.c在MATLAB指令窗中运行以下指令mcc-pmy_hello.m(3) 在DOS状态下验证mbuild、mcc工作正确性本次任务的实现:将gui生成exe已有gui.m文件和g
9、ui.fig文件1在matlab的command窗口中输入mcc-BsglGUI.m(注:mcc-mGUI.m表示创建C的独立程序mcc-pGUI.m表示创建C+的独立程序mcc-BsglGUI.m表示创建C的独立程序包含图形mcc-BsglcppGUI.m表现创建C+的独立程序包含图形)2.将上步生成的文件包括*m文件和*.fig文件一起考到待运行的机器此时仍需matlab所必需的动态连接库。3.将/extern/lib/win32/mglinstallar.exel拷贝到到待运行机器上4.在机器上先运行mglinstallar.exe,然后选择解压目录,将在将在指定目录下解压缩出bin和t
10、oolbox两个子目录,其中在binwin32目录下就是数学库和图形库脱离MATLAB运行所需的所有动态连接库,共有37个。可以将这些.dll考入system32,也可以直接放在应用程序目录下。而toolbox目录则必须与应用程序同一目录。5.大功告成。同理可将单独的.M文件生成EXE把多个M文件创建为一个独立可执行程序要建立独立可执行文件程序,最简单的方法就是建立一个或多个M文件或多个M文件或MEX文件,而不用自己写C源代码。写M文件利用MATLAB解释器的简单方便的开发环境和强大的功能来调试程序。调试成功后再用MATLAB编译器把它转化为独立可执行程序,可以大大提高程序调试效率。一般来说,
11、最好不要修改MATLAB编译器生成C/C+代码。如果不满足要求,可以随时修改M文件,在用MATLAB编译器编译即可,如果一定要修改C/C+源代码,注意当再次用MATLAB编译器编译M文件时,对C/C+代码的修改将会被冲掉。两个M文件同时编译为一个独立可执行程序例:把两个M文件marnk.和main.m作为源文件来创建独立可执行程序文件mrank.m:functionr=mark(n)r=zero(n,1);fork=1:nr(k)=rank(magic(k);end文件main.m:functionmainr=mrank(5);r文件mrank.m返回一个整型向量r,表示一个magic矩阵的阶
12、,其中r=zero(n,1)用来帮助MATLAB编译器预留内存空间。main.m调用mrank函数并打印输出值。要把这两个M文件编译成一个独立可执行程序。只需运行:mccmcmainmrank-m选项调用MATLAB编译器产生适用于独立可执行程序的C源代码,-c选项指不调用mbuild指令功能。生成的C源代码文件如下:main.cmain.hmain_main.cmrank.cmrank.h其中main_main.c文件包含了一个C函数mainmain.c和mrank.c和mrank.c文件中都包含了C函数mlfMain和mlfMrank,然后再运行指令Mbuildmain.cmain_mai
13、n.cmrank.c就能生成独立可执行程序main.exe其实,可以用一条指令来把这两个M文件转化为一个独立可执行程序mccmmainmrank这一条指令完成了上面两条指令的功能,生成同样的文件。如果要生成C+代码,只需在mcc指令后面加上-Lcpp,把C编译器换为C+编译器即可。参考资料:独立可执行C/C+程序的创建流程不论在任何操作系统上,要建立独立可执行的C/C+程序必须要经过两个步骤:1、验证mbuild命令能创建独立可执行程序2、验证MATLAB编译器能链接目标文件和相应的库文件形成独立可执行程序要打包使用独立可执行程序,必须包括此程序的可执行文件和相应的需要被链接的共享函数库,注意
14、不同的操作系统有不同的共享函数库。建立独立可执行C/C+程序一个很有用的命令是mbuild,它主要用来自定义独立可执行程序的配置和建立过程,它是一种简单方便的配置文件的方法。主要功能有:1、设定C/C+编译器和连接器2、改变C/C+编译器和连接器的设置3、在C/C+应用之间切换4、建立独立可执行C/C+程序MATLAB编译器用mcc命令可以自动调用mbuild命令。用mccm和mccp调用mbuild来实现编译和连接。如果不想自动调用mbuild,可以-c用选项,格式如下:mccmc文件名MATLAB编译器的选项文件包含了用户特定的C/C+编译器和连接器的设置要求,MATLAB为每一种它所支持
15、的C/C+编译器都提供了选项文件。用户可以根据自己的需要修改选项文件一式编译器的设置满足自己的要求。Matlab与VC集成集成的几种实现方法为了实现混合编程,Matlab5.0以后版本自带了C语言编译器(Compiler),可以将M文件转换为C-MEX或C/C+程序。根据Matlab是否运行,一般将Matlab与VC混合编程分为两大类:Matlab在后台运行和可以脱离Matlab环境运行。1Matlab引擎(Engine)采用客户机/服务器(Client/Server)的计算方式,通过Windows的ActivcX通道和Matlab接口。在具体的应用中,VC的程序作为前端客户机,通过调用Mat
16、labEngine在后台与Matlab服务器建立连接,实现动态通信。这种方法实现较为简单,不要求连接整个Matlab,只需要嵌入必要的MatlabEngine库,可大大地节省系统资源,但这种Matlab在后台运行,运行效率低下。2Mideva是Mathtools公司推出的一种Matlab集成编译开发平台,提供对Matlab程序文件(M文件)的解释执行和开发环境支持。经过简单设置后Mideva可以将M源文件转换为C/C+,然后添加到MSVC、C+Builder的工程中。3.另一种方法是先利用Mideva直接生成EXE文件(方法是启动Mideva,在菜单“File-Compiletoexe”中,选
17、出需要转换的M文件),然后在VC中通过Shell调用,常见的外部函数有shellexec()或winexec()。这种方法简单方便,但运行时出现一个控制台窗口,而且由于VC和Matlab之间不能交互,通用性差,仅适用于VC中调用Matlab实现图形显示的场合。4.最新也是最方便的方法是通过Matlab6.0Add-in实现Matlab与VC的混合编程。以上方法1需要Matlab在后台运行,方法2、3、4可以脱离Matlab环境运行。MatlabAdd-inMatlab6.0以后版本对其Compiler作了较大的改进,其支持更多的数据类型,更强的优化功能,更为重要的是其MatlabAdd-in提
18、供了一个Matlab和VC直接集成的途径。它具有一些新的特征:快速集成M文件到C+工程中,创建独立的C/C+应用程序或CMEXDLL;通过M文件创建共享库或MEX文件;内含VisualMatrixViewer,调试过程中可以查看矩阵变量的值;直接修改M源文件而不是修改生成的C/C+文件;方便快捷地打包应用程序等。MatlabAdd-in的安装:1.启动Matlab,运行“mex-setup”,按照菜单提示选取MSVC。它将配置MEX使用MSVC为默认的编译器(创建C-MEX文件必需),并安装MatlabAdd-in所需文件到MSVC目录。2.在Matlab环境下运行“mbuild-setup”
19、,按提示选取MSVC。它将配置使用MSVC为默认的编译器(创建独立应用程序必需),并安装MatlabAdd-in所需的MatlabCompiler和C/C+数学库文件到MSVC目录。3.在Matlab环境下运行“cd(prefdir)”和“mccsavepath”。它将保存当前Matlab路径到mccpath文件中,这是因为MatlabAdd-in脱离Matlab运行,否则它无从知道Matlab路径。4.在MSVC环境中配置MatlabAdd-in,方法是:从菜单“Tools-Customize”选择“Add-insandMacroFiles”选项卡,选中“MatlabAdd-in”,点击“C
20、lose”。MSVC工具栏出现MatlabAdd-in图标,以后每次启动VC,自动加载MatlabAdd-in。5.配置Windows系统。在Windows95/98系统下,找到config.sys,添加一行:shell=c:/e:32768/p(WindowsME有所不同,需设置Conagent.exe的属性Memory选项卡的InitialEnvironment值为4096)。从表面看,VC的环境设置也是步骤较多,但只需设置一次。程序示例下面以创建一个Standalone程序为例具体说明。启动MSVC,打开“File-New”菜单,选择Project,选择“MatlabProjectWiz
21、ard”,ProjectName命名为Mytest,点击Next,你可以选择所生成的应用程序的类型:WindowsConsoleEXE、C-MEXDLL、M-MEXDLL、SharedM-DLL;C程序还是C+程序;选取Debug、Release模式;选择是否生成Main函数;是否需要支持图形。这里选择生成C+程序,其余采取默认设置,点击“Finish”,出现对话框要求选择添加到工程中的M源文件,选择文件testplot.m后,这时你可以看到MSVC调用MCC生成一个混合M文件和C的工程。在“FileView”选项卡中可以看到添加的M文件和自动生成的C+文件。这时大功告成,即可按F7编译后按F
22、5运行了,运行结果如下图所示。程序运行结果这里用到的testplot.m内容如下(先在Matlab里编辑好):functionmytest()t=0:0.05*pi:2*pi;y=sin(t);plot(t,y,b*);Matlab整合VC的编程了。也有相关的论文: 当涉及到接口编程的时候,mglinstaller.exe压缩文件也是随时要用到的,关于mglinstaller.exe的一些信息在 有许多说明,敬请查阅。小结刚开始我的机子装的MATLAB是7.0版本,此版本编译功能并不如6.版本,而且很多命令都已发生变化,后来又装了7.0的版本,同时有两个版本也发现了问题,在MATLAB6.5环境下用mcc编译成功后运行exe文件出现错误:无法定位程序输入点mxGetRegisterInternalFcnsFcn于动态链接库libmx.dll上.将7.0的版本卸载后就没有问题了我对MATLAB这方面的知识只是刚开始接触,不足之处望大家指正!-)