您好,欢迎来到微智科技网。
搜索
您的当前位置:首页MATLAB外部程序接口技术

MATLAB外部程序接口技术

来源:微智科技网
第十一章 MATLAB外部程序接口技术

11.1 11.2

11.2.1

M编译器的功用和前提准备 创建MEX文件

MEX文件编译的验证

【例11.2-1】验证mex应用程序把C码文件编译成MEX文件的正确性。 (1)先将matlab\\extern\\examples\\mex目录下的yprime.c文件复制到用户自己的工作目录(比方d:\\mywork),然后将此文件名改为my_yprime.c。 (2)运行以下指令

cd d:\\mywork mex my_yprime.c my_yprime(1,1:4) which my_yprime ans =

2.0000 8.9685 4.0000 -1.0947

d:\\mywork\\my_yprime.dll

〖说明〗

 应该指出:mex的编译操作也可以象图11.2-1那样在DOS环境中进行,结果相同。

图 11.2-1 在DOS状态下进行编译操作

【例11.2-2】验证mcc应用程序把M码文件编译成MEX文件的正确性。 (1)先将matlab\\extern\\examples\\mex目录下的yprime.m文件复制到用户自己的工作目录(比方d:\\mywork),然后将此文件名改为my_yprime_m.m。 (2)运行以下指令

cd d:\\mywork %把用户目录指定为当前目录 mcc -x my_yprime_m my_yprime_m(1,1:4) which my_yprime_m ans =

2.0000 8.9685 4.0000

1

-1.0947

d:\\mywork\\my_yprime_m.dll

11.2.2 由M文件创建C MEX文件的算例

【例11.2-3】先编写一个“判断方阵是否奇异”的M文件,然后由该M文件生成相应的MEX文件。

(1)在MATLAB的编辑器中,编写下面的函数文件exm1.m 。 [exm1.m]

function y=exm1(A) [m,n]=size(A); if m~=n;

error('An input matrix should be n-by-n.') end

r=rank(A); if r==m

disp('This 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) which exm1 A =

1 0 1 2 1 0 4 1 4

This matrix is nonsigular d:\\mywork\\exm1.dll

【例11.2-4】产生一个绘圆的MEX文件。本例演示:(A)M脚本文件不能被编译;(B)如何把脚本文件改写成函数文件;(C)改写后的M函数文件可被正确编译。 (1)原始的绘圆脚本文件 [circle.m]

clf;r=2;t=0:pi/100:2*pi;x=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:\\MATLAB53\oolbox\\compiler\\mcc.dll

(3)把脚本文件改写成函数文件 [circle_f.m]:

function circle_f(r)

2

clf;t=0:pi/100:2*pi;x=r*exp(i*t); plot(x,'r*');axis('square')

(4)再对circle_f.m进行编译,将顺利通过

mcc -x circle_f

(5)运行生成的MEX文件circle_f.dll

circle_f(0.5) which circle_f

d:\\mywork\\circle_f.dll 0.50.40.30.20.10-0.1-0.2-0.3-0.4-0.5-0.500.5图11.2-2 MEX文件circle_f.dll所画的圆 11.3

11.3.1

创建的外部应用程序

M编译器的预配置

一 对M编译器mbuild应用程序的设置 二 配置正确性的验证

【例11.3-1】验证mbuild应用程序把C码文件编译成EXE文件的正确性。

(1)先将matlab\\extern\\examples\\cmath 目录下的ex1.c文件复制到用户自己的工作目录(比方d:\\mywork),然后将此文件名改为my_ex1.c。

(2)在MATLAB指令窗中运行以下指令,将在d:\\mywork目录下产生my_ex1.exe。

cd d:\\mywork mbuild my_ex1.c

(3)打开Windows的DOS窗口,并使d:\\mywork成为当前目录,运行my_ex1.exe,若得到结果与图11.3-1相同,就表示mbuild应用程序工作正常。

3

图 11.3-1 在DOS窗口运行验证程序my_ex1.exe所得的结果

【例11.3-2】验证mcc应用程序把M文件编译成EXE文件的正确性。

(1)先将matlab\\extern\\examples\\compiler目录下的hello.m文件复制到用户自己的工作目录(比方d:\\mywork),然后将此文件名改为my_hello.m。

(2)在MATLAB指令窗中运行以下指令,便在d:\\mywork目录下产生my_hello.exe。

mcc -p my_hello.m

(3)打开Windows的DOS窗口,并使d:\\mywork成为当前目录,运行my_hello.exe,若得到结果与图11.3-2相同,就表示MATLAB编译器工作正常。

图11.3-2 在DOS窗口运行验证程序my_hello.exe所得的结果

【例11.3-3】验证mbuild、mcc工作正确性也可以在DOS状态下进行。 (1)为确保验证过程的可信度,首先删除d:\\mywork目录上的所有文件。

(2)将MATLAB自带的ex1.c和hello.m文件复制到用户自己的工作目录d:\\mywork ,并将它们分别改名为my_ex1.c和my_hello.m 。

(3)然后打开Windows的DOS窗口,进行如图11.3-3的操作。 (4)假如所得结果与图11.3-3相同,则表明工作正常。

4

图 11.3-3 在DOS状态验证编译指令

11.3.2 外部程序的工作特点和创建过程

一 外部程序与MEX文件的不同工作特点 二 外部程序创建过程说明

11.3.3 11.3.4

关于指令mbuild

科学计算和结果可视化应用程序的创建

一 创建应用程序时mcc的使用格式 二 由全M源文件产生EXE科学计算应用程序

【例11.3-4】创建一个适应“超定”、“恰定”、“欠定”线性方程求解的示例性应用程序。 (1)编写以下两个M函数文件。 [LLS.m]

function LLS() Ae=5; Av=2;

[A,b]=LLSDATA(Ae,Av); x=A\\b;

%以下都是为获得较清晰的显示而编写 S='恰定'; if Ae>Av

S='超定'; elseif Aedisp(['用外部程序求如下' S '方程 Ax=b 的解,其中']) cs=blanks(Ae)';

5

ns=fix(Ae/2);

As=cs;As(ns)='A'; bs=cs;bs(ns)='b'; es=cs;es(ns)='=';

disp([As cs es cs num2str(A) cs cs cs cs cs bs cs es cs num2str(b)]) disp('方程的解 ') nxs=fix(Av/2); cxs=blanks(Av)'; xs=cxs;xs(nxs)='x'; exs=cxs;exs(nxs)='=';

disp([xs cxs exs cxs num2str(x)])

[LLSDATA.m]

function [A,b]=LLSDATA(Ae,Av) n=max(Ae,Av); WA=magic(n); A=WA(:,1:Av); if n>Ae

A=WA(1:Ae,:); end

b=ones(Ae,1);

(2)对存放在d:\\mywork上的这两个文件进行编译。

图 11.3-4 应用程序LLS.exe解超定方程示例

(3)把LLS.m文件第2、3行改为Ae=3;Av=5,将文件另存为LLS1.m并重新编译、运行。

mcc -p LLS1 !LLS1

外部程序求欠定方程 Ax=b 解,其中 A = 17 24 1 8 15 b = 1 23 5 7 14 16 1 4 6 13 20 22 1 方程的解

0.013372 x = 0.0063953 0 0 0.041279

6

三 可视化应用程序的产生和使用

【例11.3-5】产生一个能绘制类似图6.3-3所示图形的C++应用程序。 (1)将例6.3-3中的代码加上function“头”后保存为函数文件grph.m, function grph

[X0,Y0,Z0]=sphere(30); %产生单位球面的三维坐标

X=2*X0;Y=2*Y0;Z=2*Z0; %产生半径为2的球面的三维坐标 surf(X0,Y0,Z0); %画单位球面 shading interp %采用插补明暗处理 hold on,mesh(X,Y,Z),colormap(hot),hold off %采用hot色图 hidden off %产生透视效果 axis equal,axis off %不显示坐标轴

(2)运行以下指令,对grph.m进行编译,可以得到C++语言的外部应用程序grph.exe 。 mcc -B sglcpp grph

(3)在DOS中运行grph.exe ,就可得到漂亮的玲珑球图形。(图11.3-5)

图 11.3-5 应用程序运行环境和它产生的图形

习题11

7

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务