MATLAB编译器和API.docx

上传人:b****5 文档编号:5791705 上传时间:2023-01-01 格式:DOCX 页数:26 大小:171.69KB
下载 相关 举报
MATLAB编译器和API.docx_第1页
第1页 / 共26页
MATLAB编译器和API.docx_第2页
第2页 / 共26页
MATLAB编译器和API.docx_第3页
第3页 / 共26页
MATLAB编译器和API.docx_第4页
第4页 / 共26页
MATLAB编译器和API.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

MATLAB编译器和API.docx

《MATLAB编译器和API.docx》由会员分享,可在线阅读,更多相关《MATLAB编译器和API.docx(26页珍藏版)》请在冰豆网上搜索。

MATLAB编译器和API.docx

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%\bin下是否含该文件

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,2);%测量输入字符串

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

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

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