通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
资源搜索:
热门搜索:Linux VB C语言 PhotoShop Flash TCP/IP
   首页 | 文章 | 软件 | 动画 | 资源 | 励志 | 骗术 | 论坛 | 邮箱 | 会员中心 | 军事 | 科技 | 博客 | 图片 | 商城 | 最新更新 | 800g资源 | 爱心黑客
您现在的位置: 爱国者黑客 >> 资源 >> 机械电子 >> MATLAB >> Matlab基础 >> 文章正文
Matlab 创建独立的外部应用程序
责任编辑:admin   更新日期:2005-8-6

12.6 创建独立的外部应用程序
12.6.3 借助编译指令mcc创建独立应用程序

12.6.3.2 由全M源文件产生EXE应用程序
【例 12.6.3 .2-1 】创建一个适应“超定”、“恰定”、“欠定”线性方程求解的示例性应用程序。

(1)编写以下两个 M 函数文件 。
[LLS.m]
function LLS()
Ae=5; %<2>
Av=2; %<3>
[A,b]=LLSDATA(Ae,Av);
x=A\b;
% 以下都是为获得较清晰的显示而编写
S= ' 恰定 ' ;
if Ae>Av
S= ' 超定 ' ;
elseif Ae<Av
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([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 上的这两个文件进行编译 。

图 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]
function mat_feat(f_name) %<1>
disp( ' 被分析矩阵 ' ) %<2>
A=magic(4) % 给定的被分析矩阵
N=8; % 为字符串比较而设的字符串长度 8 。
n=size(f_name,2); % 测量输入字符串的长度
ff_name=[f_name blanks(N-n)]; % 给输入字符串补充空字符,使长度为 8 。
if ff_name==[ 'my_det' blanks(2)]
disp( ' 矩阵 A 的行列式值 = ' )
elseif ff_name==[ 'rank' blanks(4)]
disp( ' 矩阵 A 的秩 = ' )
elseif ff_name==[ 'norm' blanks(4)]
disp( ' 矩阵 A 的 2- 范数 = ' )
elseif ff_name==[ 'cond' blanks(4)]
disp( ' 矩阵 A 的条件数 = ' )
elseif ff_name==[ 'eig' blanks(5)]
disp( ' 矩阵 A 的特征值 = ' )
elseif ff_name==[ 'svd' blanks(5)]
disp( ' 矩阵 A 的奇异值 = ' )
else
disp( ' 您输入的指令,或者不是本函数文件所能解决的,或是错误的! ' )
end

d=feval(f_name,A);
disp(d)

[my_det.m]
function d=my_det(A)
d=det(A);

(2)创建计算给定矩阵秩的 EXE 文件
mcc -V1.2 -pm mat_feat f_name=rank

(3)所生成的 mat_feat.exe 可脱离 MATLAB 而独立运行。
!mat_feat
WARNING: Reference to uninitialized variable
被分析矩阵
[ 16 2 3 13 ;
5 11 10 8 ;
9 7 6 12 ;
4 14 15 1 ]

矩阵 A 的秩 =
3

(4)求矩阵行列式值的 EXE 文件创建指令、验证运行指令、及运行结果。
mcc -V1.2 –p –m mat_feat f_name=my_det
!mat_feat
被分析矩阵
[ 16 2 3 13 ;
5 11 10 8 ;
9 7 6 12 ;
4 14 15 1 ]

矩阵 A 的行列式值 =
0

【例 12.6.3 .3-2 】采用 编译注记法 生成一个可以计算方阵行列式值的独立外部应用程序。

(1)假定想创建一个计算矩阵行列式值的独立应用程序,那么只要在上例 mat_feat.m 文件的第 <1> 和 <2> 行之间插入以下两行指令,而 M 文件的其余部分都不必改动。
%#function my_det
f_name= 'my_det' ;

(2)用以下指令对 M 文件进行编译,便可得到正确的 EXE 文件。
mcc –p mat_feat

【例 12.6.3 .3-3 】当 feval 调用的是 MATLAB C++ 库中的函数时,可以采用更简单的 feval 输入宗量直接赋值法,实现 EXE 文件的创建。如创建一个计算方阵特征值的独立外部应用程序。

(1)只要在例 12.6.3 .3-1 的 mat_feat.m 文件第 <1> 和 <2> 行中间插入如下一条指令即可。
f_name= 'eig' ;

(2)用以下指令对 M 文件进行编译,便可得到正确的 EXE 文件。
mcc –p mat_feat

(3)以下是运行指令和结果
!mat_feat

被分析矩阵
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1

矩阵 A 的特征值 =
34.0000
8.9443
-8.9443
-0.0000
12.6.3.4 由含泛函指令的M文件生成EXE程序

【例 12.6.3 .4-1 】创建一个求一元函数 局部最小值的独立外部应用程序。

(1)为了让读者了解函数 ,对将生成的 EXE 文件的运行结果正确性做直观的判断。先运行以下指令绘制如图 12.6.3 .4-1 所示的函数曲线。
xx=0:0.01:5;
yy=SAA(xx); %SAA.m 文件见本例第 2 步
plot(xx,yy)
x0=2;
x=fmins('SAA',x0);
y=SAA(x);
plot(xx,yy,'b-',x,y,'r.','MarkerSize', 20),grid

图 12.6.3 .4-1 函数 在 2 附近的局部最小值


(2)编制以下 M 函数文件,并存放在用户自己的工作目录上。
[fcpp.m]
function fcpp(fun)
%#function SAA % 被泛函调用函数的编译注记是必须的。
fun= 'SAA' ; % 对泛函指令中第一输入宗量具体化也是必须的。
xs=1;
x=fmins(fun,xs);
y=feval(fun,x);
disp(blanks(2)')
disp( ' 独立外部程序 fcpp.exe 运行结果显示 ' )
disp(blanks(2)')
ss=[ 'sin(exp(0.6x))/x 函数在 x = ' num2str(xs) ' 附近达最小值的坐标为 ' ];
disp(ss);
disp(blanks(1)');
disp([ ' (' num2str(x) ',' num2str(y) ')' ])

[SAA.m]
function y=SAA(x)
x=x+(x==0)*eps;
y=sin(x.*exp(0.6*x))./x;

(3)在 MATLAB 指令窗或 DOS 环境中运行以下编译指令,在用户目录上产生 fcpp.exe 。
mcc –p fcpp

(4)在 DOS 中运行 fcpp.exe 的操作情况和结果如图 12.6.3 .4-2 。


图 12.6.3 .4-2 生成的独立程序 fcpp.exe 在 DOS 中的运行结果


12.6.3.5 由C/C++源码和M源码文件混合生成EXE应用文件
【例 12.6.3 .5- 1 】主程序为 C 源码文件,被调用程序为 M 文件。

(1)主文件 fileinc.c 和被调用的 mrank.m 文件如下
[fileinc.c ]
#include <stdio.h>
#include "matlab.h"
#include "templib.h"

int main(int argc, char **argv[])
{
int n ;
mxArray *r;
mxArray *N;
TemplibInitialize();
n = 5;
N=mxCreateDoubleMatrix(1,1,mxREAL);
*mxGetPr(N)=n;
r = mlfMrank(N);
mlfPrintMatrix(r);
mxDestroyArray(r);
mxDestroyArray(N);
TemplibTerminate();
return 0;
}

[mrank.m]
function r=mrank(n)
r=zeros(n,1);
for k=1:n
r(k)=rank(magic(k));
end

(2)编译混合源码文件
mcc –t –W lib:Templib -T link:exe mrank fileinc.c
mcc –t –W lib

[1] [2] 下一页

  • 上一篇文章:
  • 下一篇文章:
  • 热门文章
    Olldbg常见问题
    汇编语言的艺术(组合语言的艺术)--观
    汇编语言的艺术(组合语言的艺术)--准
    汇编语言的艺术(组合语言的艺术)--基
    汇编语言的艺术(组合语言的艺术)--基
    汇编语言---程式设计 (4)
    虚拟8086模式
    SYS命令使用说明
    javascript + CSS 实现动态菜单显
    推荐文章
    自制Windows XP SP2自动安装光盘
    SQLServer注入工具改进版 v1.02
    使用photoshop CS进行自然美肤
    Photoshop绘制诺基亚手机
    PHOTOSHOP制作秋日之梦
    PHOTOSHOP鼠绘名模王爱萍
    Photoshop制作晶莹飞溅的水珠
    教你用PHOTOSHOP做放大镜
    鼠绘美女及服装修画全过程