Matlab 参考教程第十二章 MATLAB编译器和API.docx
- 文档编号:25046556
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:31
- 大小:171.70KB
Matlab 参考教程第十二章 MATLAB编译器和API.docx
《Matlab 参考教程第十二章 MATLAB编译器和API.docx》由会员分享,可在线阅读,更多相关《Matlab 参考教程第十二章 MATLAB编译器和API.docx(31页珍藏版)》请在冰豆网上搜索。
Matlab参考教程第十二章MATLAB编译器和API
12MATLAB编译器和API
几乎所有使用过MATLAB的科技人员,无不为该软件的简洁、便捷和功能之强大和可靠所震撼,同时也对MATLAB产生了新的期望:
一,希望程序能运行得更快;二,希望获得可摆脱MATLAB环境而独立运行的可执行软件;三,希望从其他“非MATLAB”的外部程序中调用MATLAB。
本章前6节介绍MATLAB版编译器(Compiler)。
由于1.2版与2.0版差异较大,又由于2.0版缺少1.2版具有的优化功能,因此内容安排上将兼顾地论及两个版本。
值得指出的是:
除Mathworks外,还有其他一些公司生产的编译器,其中比较著名的是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.m]
clf;r=2;t=0:
pi/100:
2*pi;x=r*exp(i*t);
plot(x,'r*');axis('square')
(2)对这脚本文件直接编译将因错误而失败
mcc-xcircle
?
?
?
Error:
File"circle"isaScriptM-fileandcannotbecompiledwiththecurrentCompiler.
Errorin==>H:
\MATLAB53\toolbox\compiler\mcc.dll
(3)把脚本文件改写成函数文件。
[circle_f.m]:
functioncircle_f(r)
clf;t=0:
pi/100:
2*pi;x=r*exp(i*t);
plot(x,'r*');axis('square')
(4)再对circle_f.m进行编译,将顺利通过。
mcc-xcircle_f%mcc是编译指令,详见12.4节。
(5)运行生成的MEX文件circle_f.dll
circle_f(0.5)%调用circle_f绘制一半径为0.5的圆
whichcircle_f%查询所调用的circle_f的路径全称。
d:
\mywork\circle_f.dll
图12.1.4-1MEX文件circle_f.dll所画的圆
12.2编译器的安装和配置
12.2.1配置MATLAB编译器的前提准备
图12.2.1-1【SelectMATLABComponets】对话窗的选项局部图
12.2.2为产生MEX文件进行预配置
12.2.2.1对MATLAB编译器应用程序mex的设置
图12.2.2.1-1为产生MEX文件所产生的配置屏1
图12.2.2.1-2为产生MEX文件所产生的配置屏2
12.2.2.2配置正确性的验证
(1)mex应用程序的验证
cdd:
\mywork%把用户目录指定为当前目录
mexmy_yprime.c%由my_yprime.c文件生成my_yprime.dll文件
my_yprime(1,1:
4)%运行my_yprime.dll文件
whichmy_yprime%获得my_yprime.dll文件的位置信息
ans=
2.00008.96854.0000-1.0947
d:
\mywork\my_yprime.dll
(2)在MATLAB命令窗中验证mcc应用程序
mcc-xmy_yprime_m%<1>
my_yprime_m(1,1:
4)
whichmy_yprime_m
ans=
2.0000
8.9685
4.0000
-1.0947
d:
\mywork\my_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为产生独立外部应用程序所产生的配置屏1
图12.2.3.1-2为产生独立外部应用程序所产生的配置屏2
12.2.3.2对MATLAB编译器mbuild应用程序的设置(1.2版)
12.2.3.3配置正确性的验证
(1)mbuild应用程序的验证
cdd:
\mywork%把用户目录指定为当前目录
mbuildmy_ex1.c%在d:
\mywork下生成my_ex1.exe文件
图12.2.3.2-1在DOS窗口运行验证程序my_ex1.exe所得的结果
(2)mcc应用程序的验证
mcc-pmy_hello.m%<1>
图12.2.3.2-2在DOS窗口运行验证程序my_hello.exe所得的结果
(3)在DOS状态下验证mbuild、mcc工作正确性
图12.2.3.2-3在DOS状态验证编译指令
12.3MATLAB编译器使用入门
12.3.1由M文件创建CMEX文件的入门算例
【例12.3.1-1】先编写M文件,然后生成相应的MEX文件。
该文件用以判断方阵是否奇异。
cdd:
\mywork
(1)在MATLAB的编辑器中,编写下面的函数文件exm1.m。
[exm1.m]
functiony=exm1(A)
[m,n]=size(A);
ifm~=n;
error('Aninputmatrixshouldben-by-n.')
end
r=rank(A);
ifr==m
disp('Thismatrixisnonsigular')
else
disp('Thismatrixissigular')
end
(2)把该函数文件存放于用户目录d:
\mywork下。
(3)在MATLAB命令窗中,运行以下指令对exm1.m进行编译。
mcc-xexm1%编译m文件。
(4)调用MEX文件exm1.dll进行计算
A=[1,0,1;2,1,0;4,1,4]
exm1(A)%调用exm1来判断矩阵A是否奇异。
whichexm1%查询所调用的exm1的路径和全称。
A=
101
210
414
Thismatrixisnonsigular
d:
\mywork\exm1.dll
12.3.2由M文件创建外部应用程序的入门算例
【例12.3.2-1】建立一个脱离MATLAB环境,可独立运行的外部程序。
该程序的功能是:
对于给定矩阵A,如果存在S使得S-1AS=Λ,则要求出一个S,否则给出信息说明所给的矩阵A不能对角化。
(1)编写两个M函数文件:
exm2.m和exm2_f.m。
(第一个文件是主文件。
)
[exm2.m]
functionexm2
A=[4,0,0;0,3,1;0,1,3];
S=exm2_f(A)
[exm2_f.m]
functionS=exm2_f(A)
[m,n]=size(A);
ifm~=n
error('输入矩阵应是方阵!
');
end;
e=eig(A);
%检查输入矩阵的特征值是否各异
same=0;
fori=1:
m-1
forj=(i+1):
m
ife(j)==e(i)
same=1;
end
end
end
%A可以对角化的条件是A具有互异特征值或者A为埃尔米特矩阵。
ifany(any((A'-A)))&(same==1)
error('矩阵无法对角化!
');
end
[v,d]=eig(A);
S=v;
(2)把这两个函数文件存放于用户自己的目录d:
\mywork,并在MATLAB中运行检验。
exm2
S=
1.000000
00.70710.7071
00.7071-0.7071
(3)生成独立的外部可执行程序。
在MATLAB指令窗中,运行如下指令
mcc-mexm2exm2_f
(4)打开DOS窗口,在d:
\mywork目录下,运行exm2.exe,得如图12.3.2-1的结果。
图12.3.2-1在DOS窗口运行生成程序exm2.exe所得的结果
12.4编译指令mcc简介
12.4.1mcc的基本调用格式
12.4.2mcc的选项标志
12.4.2.1编译器2.0选项简介
12.4.2.2在命令行中指定选项标志
【例12.4.2.2-1】假设当前目录上存在一个文件exm3.m,现要求利用M编译器将它转换为C++语言的源码文件,并要求将原M文件中那注释区的内容作为所得C++源码文件的注释。
mcc-t-LCpp-Aannotation:
commentsexm3%得到exm3.cpp和exm3.hpp
12.4.2.3设置缺省选项
【例12.4.2.3-1】假设已在d:
\mywork下创建了文本文件mccstartup(请注意:
该文件不可带扩展名),该文件的内容包括若干编译指令的选项。
现要求利用该文件,从exm3.m出发得到C++语言的源文件。
cdd:
\mywork%将d:
\mywork设为当前工作目录
typemccstartup%打印文本文件mccstartup的内容
-t-LC-Aannotation:
none
!
copymccstartuph:
\y9857\temp%将mccstartup转移到临时目录下
!
copyexm3.mh:
\y9857\temp%将待编译M源码转移到临时目录下
!
delmccstartup,%删除mccstartup
!
delexm3*%删除原有的编译后文件
dirmccstartup%当前目录下是否含有mccstartup
dirh:
\matlab53\bin\mccstartup%
direxm3*%当前目录下是否含有exm3*
1file(s)copied
1file(s)copied
mccstartupnotfound.
h:
\matlab53\bin\mccstartupnotfound.
exm3*notfound.
!
copyh:
\y9857\temp\exm3.md:
\mywork
mcc-LCppexm3%<1>
1file(s)copied
_?
?
?
Error:
Theoptionsspecifiedwillnotgenerateanyoutputfiles.
Pleaseuseoneofthefollowingoptionstogenerateanexecutableoutputfile:
-x(generatesaMEX-fileexecutableusingC)
-m(generatesastand-aloneexecutableusingC)
-p(generatesastand-aloneexecutableusingC++)
-S(generatesaSimulinkMEXS-functionusingC)
Ortypemcc-?
formoreusageinformation.
Errorin==>H:
\MATLAB53\toolbox\compiler\mcc.dll
!
copyh:
\y9857\temp\mccstartupd:
\mywork%将mccstartup拷贝到当前目录
mcc-LCppexm3%<2>
direxm3*%<3>
!
delmccstartup
1file(s)copied
exm3.cppexm3.hppexm3.m
12.4.2.4编译器1.2选项简介
【例12.4.2.4-1】要求利用1.2版编辑器对文件exm4.m进行操作,目标是获得CMEX文件和C语言的独立可执行文件。
(1)在5.3版MATLAB指令窗中的执行指令
mcc-V1.2exm4
mcc-V1.2-emexm4
(2)为完成同样任务在5.2版指令窗中的执行指令
mccexm4
mcc-emexm4
12.5编译文件的性能优化
12.5.1优化原M文件的性能
12.5.1.1提高向量化程度
【例12.5.1.1-1】本例演示:
M文件与MEX文件、向量运算与循环运算的速度比较。
(1)编写如下两类函数M文件。
functiony=sa(x)
x=x+(x==0)*eps;
y=sin(x)./x;
functiony=saf(x)
n=length(x);
fork=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进行编译。
cdd:
\mywork
mcc-xsa_mex%<1>
mcc-xsaf_mex%<2>
(3)运行四个文件,记录运算时间
t=-2*pi:
pi/500:
2*pi;
tic;sa(t);tt
(1)=toc;
tic;saf(t);tt
(2)=toc;
tic;sa_mex(t);tt(3)=toc;
tic;y=saf_mex(t);tt(4)=toc;
(4)结果显示和比较
plot(t,y,'r-');grid
图12.5.1.1-1
disp('运算速度比较')
disp('sa.msaf.msa_mex.dllsaf_mex.dll')
disp(tt)
运算速度比较
sa.msaf.msa_mex.dllsaf_mex.dll
0.33002.91000.38002.5800
12.5.1.2对数组进行预置
【例12.5.1.2-1】以上节例12.5.1.1-1为基础。
saf.m文件中数组变量x和y的大小随循环进行而增长,这大大减慢了运算速度。
本例演示:
在循环前对进行变量预置的好处。
(1)编写如下文件,以saf_pro.m和saf_pro_mex.m为名,将之保存在当前目录下。
functiony=saf(x)
n=length(x);
x=zeros(1,n);y=zeros(1,n);
fork=1:
n
x(k)=x(k)+(x(k)==0)*eps;
y(k)=sin(x(k))/x(k);
end
(2)产生编译文件
mcc-xsaf_mex
mcc-xsaf_pro_mex
(3)运行
t=-2*pi:
pi/500:
2*pi;
tic;saf(t);tt
(1)=toc;
tic;saf_pro(t);tt
(2)=toc;
tic;saf_mex(t);tt(3)=toc;
tic;y=saf_pro_mex(t);tt(4)=toc;
(4)速度比较
disp('运算速度比较')
disp('saf.msaf_pro.msaf_mex.dllsaf_pro_mex.dll')
disp(tt)
运算速度比较
saf.msaf_pro.msaf_mex.dllsaf_pro_mex.dll
2.86000.66002.63000.4400
12.5.1.3避免调用复数域函数
12.5.2利用mcc(-V1.2)的优化性能
12.5.2.1编译时指定优化选项-r和-i
【例12.5.2.1-1】求如下非线性差分方程组在10000个点上的值。
观察原M文件、无选项和有选项MEX文件运行速度的不同。
(1)利用MATLAB编辑窗口编写如下M函数文件
function[x,y]=m_henon(n)
x=zeros(1,n);y=zeros(1,n);
fork=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进行编译如下。
cdd:
\mywork
mcc-xmex20_henon%用2.0编译器产生普通MEX文件<1>
mcc-V1.2-riri_mex12_henon%用1.2编辑器产生优化的MEX文件<2>
(3)计算各文件运行时间费用的相对值。
n=10000;
t=zeros(3,2);
fork=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;
end
t=t/t(1,1);
(4)显示比较结果
filename=['m_henon';
'mex20_henon';
'ri_mex12_henon';];
disp(['各文件运行开销的相对值比较表'])
disp(blanks
(1)')%产生一个空行
disp(['文件名第一次运行第二次运行'])
disp([filenameblanks(3)'blanks(3)'num2str(t)])
%blanks产生两个空列
各文件运行开销的相对值比较表
文件名第一次运行第二次运行
m_henon10.78086
mex20_henon0.697530.59259
ri_mex12_henon0.0154320
12.5.2.2利用变量类型申明优化性能
12.5.2.3利用编译注记优化性能
【例12.5.2.3-1】编译注记%#ivdep的应用举例。
(1)编写如下两个函数M文件,并存放在d:
\mywork目录上。
[ivdep0.m]
functionA=ivdep0()
A=1:
10;
A(5:
9)=A(3:
7);
[ivdep.m]
functionA=ivdep()
A=1:
10;
%#ivdep
A(5:
9)=A(3:
7);
(2)分别对这两个文件进行编译。
cdd:
\mywork
mcc-V1.2ivdep0
mcc-V1.2ivdep
(3)在MATLAB指令窗中运行以下指令。
tic;A0=ivdep0;t0=toc;
tic;A=ivdep;t=toc/t0;
(4)显示结果。
A0,A
disp(['使用编译注记%#ivdep后的运用时间仅为原来的'num2str(t)])
A0=
12343456710
A=
12343434310
使用编译注记%#ivdep后的运用时间仅为原来的0.15152
12.6创建独立的外部应用程序
12.6.1独立外部程序的工作特点和创建过程
12.6.1.1独立外部程序与MEX文件的不同工作特点
12.6.1.2独立外部程序创建过程说明
12.6.2关于指令mbuild
12.6.3借助编译指令mcc创建独立应用程序
12.6.3.1创建独立应用程序时mcc的使用格式和常用选项标志
12.6.3.2由全M源文件产生EXE应用程序
【例12.6.3.2-1】创建一个适应“超定”、“恰定”、“欠定”线性方程求解的示例性应用程序。
(1)编写以下两个M函数文件。
[LLS.m]
functionLLS()
Ae=5;%<2>
Av=2;%<3>
[A,b]=LLSDATA(Ae,Av);
x=A\b;
%以下都是为获得较清晰的显示而编写
S='恰定';
ifAe>Av
S='超定';
elseifAe S='欠定'; end disp(['用外部独立程序求如下'S'方程Ax=b的解,其中']) cs=blanks(Ae)';%产生一个由方程数决定的空白字符列 ns=fix(Ae/2);%从零方向最接近空白列长之半的数 As=cs;As(ns)='A'; bs=cs;bs(ns)='b'; es=cs;es(ns)='='; disp([Ascsescsnum2str(A)cscscscscsbscsescsnum2str(b)]) disp('方程的解') nxs=fix(Av/2); cxs=blanks(Av)'; xs=cxs;xs(nxs)='x'; exs=cxs;exs(nxs)='='; disp([xscxsexscxsnum2str(x)]) [LLSDATA.m] function[A,b]=LLSDATA(Ae,Av) n=max(Ae,Av); WA=magic(n); A=WA(: 1: Av); ifn>Ae A=WA(1: Ae,: ); end b=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.m] functionmat_feat(f_name)%<1> disp('被分析矩阵')%<2> A=magic(4)%给定的被分析矩阵 N=8;%为字符串比较而设的字符串长度8。 n=size(f_name,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab 参考教程第十二章 MATLAB编译器和API 参考 教程 第十二 编译器 API