ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:171.70KB ,
资源ID:25046556      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25046556.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Matlab 参考教程第十二章 MATLAB编译器和API.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Matlab 参考教程第十二章 MATLAB编译器和API.docx

1、Matlab 参考教程第十二章 MATLAB编译器和API12 MATLAB编译器和API 几乎所有使用过MATLAB的科技人员,无不为该软件的简洁、便捷和功能之强大和可靠所震撼,同时也对MATLAB产生了新的期望:一,希望程序能运行得更快;二,希望获得可摆脱MATLAB环境而独立运行的可执行软件;三,希望从其他“非MATLAB”的外部程序中调用MATLAB。 本章前6节介绍MATLAB版编译器(Compiler)。由于1.2版与2.0版差异较大,又由于2.0版缺少1.2版具有的优化功能,因此内容安排上将兼顾地论及两个版本。值得指出的是:除Mathworks外,还有其他一些公司生产的编译器,其

2、中比较著名的是MathTools公司的Mediva;据该公司自称,性能优于Mathworks的,且具有绘图功能。 本章第7节论及API应用程序接口,扼要地介绍不同平台间的数据传送和MATLAB引擎技术。节后算例演示了,如何从外部调用MATLAB引擎。12.1 编译器2.0概述12.1.1 编译器2.0的功能12.1.2 编译器2.0的性能改进12.1.3 编译器2.0的局限性12.1.4 把脚本文件改写为函数文件【例12.1.4-1】有一个绘圆的M脚本文件circle.m如下。希望获得一个MEX绘圆程序。(1)原始的绘圆脚本文件circle.mclf;r=2;t=0:pi/100:2*pi;x

3、=r*exp(i*t);plot(x,r*);axis(square)(2)对这脚本文件直接编译将因错误而失败mcc -x circle ? Error: File circle is a Script M-file and cannot be compiled with the current Compiler.Error in = H:MATLAB53toolboxcompilermcc.dll (3)把脚本文件改写成函数文件。circle_f.m:function circle_f(r)clf;t=0:pi/100:2*pi;x=r*exp(i*t);plot(x,r*);axis(sq

4、uare)(4)再对circle_f.m进行编译,将顺利通过。mcc -x circle_f %mcc是编译指令,详见12.4节。 (5)运行生成的MEX文件circle_f.dllcircle_f(0.5) %调用circle_f绘制一半径为0.5的圆 which circle_f %查询所调用的circle_f的路径全称。 d:myworkcircle_f.dll图12.1.4-1 MEX文件circle_f.dll所画的圆12.2 编译器的安装和配置12.2.1 配置MATLAB编译器的前提准备图 12.2.1-1 【Select MATLAB Componets】对话窗的选项局部图12

5、.2.2 为产生MEX文件进行预配置12.2.2.1 对MATLAB编译器应用程序mex的设置图 12.2.2.1-1 为产生MEX文件所产生的配置屏1图 12.2.2.1-2 为产生MEX文件所产生的配置屏212.2.2.2 配置正确性的验证(1)mex应用程序的验证cd d:mywork %把用户目录指定为当前目录mex my_yprime.c %由my_yprime.c文件生成my_yprime.dll文件my_yprime(1,1:4) %运行my_yprime.dll文件which my_yprime %获得my_yprime.dll文件的位置信息 ans = 2.0000 8.96

6、85 4.0000 -1.0947d:myworkmy_yprime.dll (2)在MATLAB命令窗中验证mcc应用程序mcc -x my_yprime_m %my_yprime_m(1,1:4)which my_yprime_m ans = 2.0000 8.9685 4.0000 -1.0947d:myworkmy_yprime_m.dll (3)在 DOS提示符后验证mex、mcc应用程序图 12.2.2.2-1 在DOS状态下验证编译指令12.2.3 为产生独立外部应用程序进行预配置12.2.3.1 对MATLAB编译器mbuild应用程序的设置(2.0版)图 12.2.3.1-1

7、 为产生独立外部应用程序所产生的配置屏1图 12.2.3.1-2 为产生独立外部应用程序所产生的配置屏212.2.3.2 对MATLAB编译器mbuild应用程序的设置(1.2版)12.2.3.3 配置正确性的验证(1)mbuild应用程序的验证cd d:mywork %把用户目录指定为当前目录mbuild my_ex1.c %在d:mywork下生成my_ex1.exe文件图 12.2.3.2-1 在DOS窗口运行验证程序my_ex1.exe所得的结果(2)mcc应用程序的验证mcc -p my_hello.m % 图12.2.3.2-2 在DOS窗口运行验证程序my_hello.exe所得

8、的结果(3)在DOS状态下验证mbuild、mcc工作正确性图 12.2.3.2-3 在DOS状态验证编译指令12.3 MATLAB编译器使用入门12.3.1 由M文件创建C MEX文件的入门算例【例12.3.1-1】先编写M文件,然后生成相应的MEX文件。该文件用以判断方阵是否奇异。cd d:mywork (1)在MATLAB的编辑器中,编写下面的函数文件exm1.m 。exm1.mfunction y=exm1(A)m,n=size(A);if m=n; error(An input matrix should be n-by-n.)endr=rank(A);if r=m disp(Thi

9、s matrix is nonsigular)else disp(This matrix is sigular)end(2)把该函数文件存放于用户目录d:mywork下。(3)在MATLAB命令窗中,运行以下指令对exm1.m进行编译。 mcc -x exm1 %编译m文件。 (4)调用MEX文件exm1.dll 进行计算A=1,0,1;2,1,0;4,1,4 exm1(A) %调用exm1来判断矩阵A是否奇异。 which exm1 %查询所调用的exm1的路径和全称。 A = 1 0 1 2 1 0 4 1 4This matrix is nonsigulard:myworkexm1.dl

10、l 12.3.2 由M文件创建外部应用程序的入门算例【例12.3.2-1】建立一个脱离MATLAB环境,可独立运行的外部程序。该程序的功能是:对于给定矩阵A,如果存在S使得S-1AS=,则要求出一个S,否则给出信息说明所给的矩阵A不能对角化。(1)编写两个M函数文件:exm2.m和exm2_f.m 。(第一个文件是主文件。)exm2.mfunction exm2A=4,0,0;0,3,1;0,1,3;S=exm2_f(A)exm2_f.mfunction S=exm2_f(A)m,n=size(A);if m=n error(输入矩阵应是方阵!);end;e=eig(A);%检查输入矩阵的特征

11、值是否各异same=0;for i=1:m-1 for j=(i+1):m if e(j)=e(i) same=1; end endend% A可以对角化的条件是A具有互异特征值或者A为埃尔米特矩阵。if any(any(A-A)&(same=1) error(矩阵无法对角化!);endv,d=eig(A);S=v;(2)把这两个函数文件存放于用户自己的目录d:mywork,并在MATLAB中运行检验。exm2 S = 1.0000 0 0 0 0.7071 0.7071 0 0.7071 -0.7071 (3)生成独立的外部可执行程序。在MATLAB指令窗中,运行如下指令mcc -m exm

12、2 exm2_f (4)打开DOS窗口,在d:mywork目录下,运行exm2.exe,得如图12.3.2-1的结果。图12.3.2-1 在DOS窗口运行生成程序exm2.exe所得的结果12.4 编译指令mcc简介12.4.1 mcc的基本调用格式12.4.2 mcc的选项标志12.4.2.1 编译器2.0选项简介12.4.2.2 在命令行中指定选项标志【例12.4.2.2-1】假设当前目录上存在一个文件exm3.m ,现要求利用M编译器将它转换为C+语言的源码文件,并要求将原M文件中那注释区的内容作为所得C+源码文件的注释。mcc -t -L Cpp -A annotation:comme

13、nts exm3 %得到exm3.cpp和exm3.hpp 12.4.2.3 设置缺省选项【例12.4.2.3-1】假设已在d:mywork下创建了文本文件mccstartup (请注意:该文件不可带扩展名),该文件的内容包括若干编译指令的选项。现要求利用该文件,从exm3.m出发得到C+语言的源文件。cd d:mywork %将d:mywork设为当前工作目录type mccstartup %打印文本文件mccstartup的内容 -t -L C -A annotation:none !copy mccstartup h:y9857temp %将mccstartup转移到临时目录下!copy

14、 exm3.m h:y9857temp %将待编译M源码转移到临时目录下!del mccstartup , %删除mccstartup!del exm3* %删除原有的编译后文件dir mccstartup %当前目录下是否含有mccstartupdir h:matlab53binmccstartup %bin下是否含该文件 dir exm3* %当前目录下是否含有exm3* 1 file(s) copied 1 file(s) copied mccstartup not found.h:matlab53binmccstartup not found.exm3* not found. !cop

15、y h:y9857tempexm3.m d:myworkmcc -L Cpp exm3 % 1 file(s) copied _? Error: The options specified will not generate any output files.Please use one of the following options to generate an executable output file: -x (generates a MEX-file executable using C) -m (generates a stand-alone executable using C

16、) -p (generates a stand-alone executable using C+) -S (generates a Simulink MEX S-function using C)Or type mcc -? for more usage information.Error in = H:MATLAB53toolboxcompilermcc.dll !copy h:y9857tempmccstartup d:mywork %将mccstartup拷贝到当前目录mcc -L Cpp exm3 %dir exm3* %!del mccstartup 1 file(s) copie

17、d exm3.cpp exm3.hpp exm3.m 12.4.2.4 编译器1.2选项简介【例12.4.2.4-1】要求利用1.2版编辑器对文件exm4.m进行操作,目标是获得C MEX文件和C语言的独立可执行文件。(1)在5.3版MATLAB指令窗中的执行指令mcc -V1.2 exm4mcc -V1.2 -em exm4(2)为完成同样任务在5.2版指令窗中的执行指令mcc exm4mcc -em exm4 12.5 编译文件的性能优化12.5.1 优化原M文件的性能12.5.1.1 提高向量化程度【例12.5.1.1-1】本例演示:M文件与MEX文件、向量运算与循环运算的速度比较。(1

18、)编写如下两类函数M文件。function y=sa(x)x=x+(x=0)*eps;y=sin(x)./x;function y=saf(x)n=length(x);for k=1:n x(k)=x(k)+(x(k)=0)*eps; y(k)=sin(x(k)/x(k);end(2)在MATLAB指令窗中,对sa_mex.m和saf_mex.m进行编译。cd d:myworkmcc -x sa_mex %mcc -x saf_mex %(3)运行四个文件,记录运算时间t=-2*pi:pi/500:2*pi;tic;sa(t);tt(1)=toc;tic;saf(t);tt(2)=toc;ti

19、c;sa_mex(t);tt(3)=toc;tic;y=saf_mex(t);tt(4)=toc;(4)结果显示和比较plot(t,y,r-);grid 图12.5.1.1-1disp(运算速度比较)disp( sa.m saf.m sa_mex.dll saf_mex.dll)disp(tt) 运算速度比较 sa.m saf.m sa_mex.dll saf_mex.dll 0.3300 2.9100 0.3800 2.5800 12.5.1.2 对数组进行预置【例12.5.1.2-1】以上节例12.5.1.1-1为基础。saf.m文件中数组变量x和y 的大小随循环进行而增长,这大大减慢了运

20、算速度。本例演示:在循环前对进行变量预置的好处。(1)编写如下文件,以saf_pro.m和saf_pro_mex.m为名,将之保存在当前目录下。function y=saf(x)n=length(x);x=zeros(1,n);y=zeros(1,n);for k=1:n x(k)=x(k)+(x(k)=0)*eps; y(k)=sin(x(k)/x(k);end(2)产生编译文件 mcc -x saf_mex mcc -x saf_pro_mex (3)运行t=-2*pi:pi/500:2*pi;tic;saf(t);tt(1)=toc;tic;saf_pro(t);tt(2)=toc;ti

21、c;saf_mex(t);tt(3)=toc;tic;y=saf_pro_mex(t);tt(4)=toc;(4)速度比较disp(运算速度比较)disp( saf.m saf_pro.m saf_mex.dll saf_pro_mex.dll)disp(tt) 运算速度比较 saf.m saf_pro.m saf_mex.dll saf_pro_mex.dll 2.8600 0.6600 2.6300 0.4400 12.5.1.3 避免调用复数域函数12.5.2 利用mcc(-V1.2)的优化性能12.5.2.1 编译时指定优化选项-r和-i【例12.5.2.1-1】求如下非线性差分方程组

22、在10000个点上的值。观察原M文件、无选项和有选项MEX文件运行速度的不同。(1)利用MATLAB编辑窗口编写如下M函数文件function x,y=m_henon(n)x=zeros(1,n);y=zeros(1,n);for k=1:n-1 x(k+1)=1+y(k)-1.4*x(k)2; y(k+1)=0.3*x(k);end(2)对M文件分别选用编译器2.0和1.2进行编译如下。cd d:myworkmcc -x mex20_henon %用2.0编译器产生普通MEX文件 mcc -V1.2 -ri ri_mex12_henon %用1.2编辑器产生优化的MEX文件 (3)计算各文件

23、运行时间费用的相对值。n=10000;t=zeros(3,2);for k=1:2 %运行两次,以做比较 tic;m_henon(n);t(1,k)=toc; tic;mex20_henon(n);t(2,k)=toc; tic;ri_mex12_henon(n);t(3,k)=toc;endt=t/t(1,1); (4)显示比较结果filename= m_henon; mex20_henon; ri_mex12_henon;disp( 各文件运行开销的相对值比较表)disp(blanks(1) %产生一个空行disp( 文件名 第一次运行 第二次运行)disp(filename blanks

24、(3) blanks(3) num2str(t) %blanks产生两个空列 各文件运行开销的相对值比较表 文件名 第一次运行 第二次运行 m_henon 1 0.78086 mex20_henon 0.69753 0.59259ri_mex12_henon 0.015432 0 12.5.2.2 利用变量类型申明优化性能12.5.2.3 利用编译注记优化性能【例12.5.2.3-1】编译注记 %#ivdep的应用举例。(1)编写如下两个函数M文件,并存放在d:mywork目录上。ivdep0.mfunction A=ivdep0( )A=1:10;A(5:9)=A(3:7);ivdep.mf

25、unction A=ivdep( )A=1:10;%#ivdepA(5:9)=A(3:7);(2)分别对这两个文件进行编译。cd d:myworkmcc -V1.2 ivdep0mcc -V1.2 ivdep(3)在MATLAB指令窗中运行以下指令。tic;A0=ivdep0;t0=toc;tic;A=ivdep;t=toc/t0;(4)显示结果。A0,Adisp(使用编译注记%#ivdep后的运用时间仅为原来的 num2str(t) A0 = 1 2 3 4 3 4 5 6 7 10A = 1 2 3 4 3 4 3 4 3 10使用编译注记%#ivdep后的运用时间仅为原来的 0.1515

26、2 12.6 创建独立的外部应用程序12.6.1 独立外部程序的工作特点和创建过程12.6.1.1 独立外部程序与MEX文件的不同工作特点12.6.1.2 独立外部程序创建过程说明12.6.2 关于指令mbuild12.6.3 借助编译指令mcc创建独立应用程序12.6.3.1 创建独立应用程序时mcc的使用格式和常用选项标志12.6.3.2 由全M源文件产生EXE应用程序【例12.6.3.2-1】创建一个适应“超定”、“恰定”、“欠定”线性方程求解的示例性应用程序。(1)编写以下两个M函数文件。LLS.mfunction LLS()Ae=5; %Av=2; %A,b=LLSDATA(Ae,A

27、v);x=Ab;%以下都是为获得较清晰的显示而编写S=恰定;if AeAv S=超定;elseif AeAe A=WA(1:Ae,:);endb=ones(Ae,1);(2)对存放在d:mywork上的这两个文件进行编译。图 12.6.3.2-1 独立应用程序LLS.exe解超定方程示例(3)把LLS.m文件第2、3行改为Ae=3;Av=5,重新编译、运行,结果见图12.6.3.2-2。图12.6.3.2-2 独立应用程序LLS.exe解欠定方程示例12.6.3.3 由含feval指令的M文件生成EXE文件【例12.6.3.3-1】采用编译指定法生成一个可以计算方阵各种特征量的独立外部应用程序。(1)编写函数M文件:mat_feat.m和my_det.m 。mat_feat.mfunction mat_feat(f_name) %disp(被分析矩阵) %A=magic(4) %给定的被分析矩阵N=8; %为字符串比较而设的字符串长度 8 。n=size(f_name,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1