第十一章 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