MATLAB教案.ch12.MATLAB编译器和API.doc

上传人:wux****ua 文档编号:9228427 上传时间:2020-04-04 格式:DOC 页数:20 大小:455.50KB
返回 下载 相关 举报
MATLAB教案.ch12.MATLAB编译器和API.doc_第1页
第1页 / 共20页
MATLAB教案.ch12.MATLAB编译器和API.doc_第2页
第2页 / 共20页
MATLAB教案.ch12.MATLAB编译器和API.doc_第3页
第3页 / 共20页
点击查看更多>>
资源描述
12 MATLAB 编译器和 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 x circle Error File circle is a Script M file and cannot be compiled with the current Compiler Error in H MATLAB53 toolbox compiler mcc dll 3 把脚本文件改写成函数文件 circle f m function circle f r 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 mcc 是编译指令 详见 12 4 节 5 运行生成的 MEX 文件 circle f dll circle f 0 5 调用 circle f 绘制一半径为 0 5 的圆 which circle f 查询所调用的 circle f 的路径全称 d mywork circle f dll 5 1 2 3 4 5 图 12 1 4 1 MEX 文件 circle f dll 所画的圆 12 2编译器的安装和配置 12 2 1配置 MATLAB 编译器的前提准备 图 12 2 1 1 Select MATLAB Componets 对话窗的选项局部图 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 应用程序的验证 cd d mywork 把用户目录指定为当前目录 mex my yprime c 由 my yprime c 文件生成 my yprime dll 文件 my yprime 1 1 4 运行 my yprime dll 文件 which my yprime 获得 my yprime dll 文件的位置信息 ans 2 0000 8 9685 4 0000 1 0947 d mywork my yprime dll 2 在 MATLAB 命令窗中验证 mcc 应用程序 mcc x my yprime m my yprime m 1 1 4 which my 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 应用程序的验证 cd d mywork 把用户目录指定为当前目录 mbuild my ex1 c 在 d mywork 下生成 my ex1 exe 文件 图 12 2 3 2 1 在 DOS 窗口运行验证程序 my ex1 exe 所得的结果 2 mcc 应用程序的验证 mcc p my hello m 图 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 文件创建 C MEX 文件的入门算例 例 12 3 1 1 先编写 M 文件 然后生成相应的 MEX 文件 该文件用以判断方阵是否奇 异 cd d mywork 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 调用 exm1 来判断矩阵 A 是否奇异 which exm1 查询所调用的 exm1 的路径和全称 A 1 0 1 2 1 0 4 1 4 This matrix is nonsigular 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 function exm2 A 4 0 0 0 3 1 0 1 3 S exm2 f A exm2 f m function S exm2 f A m n size A if m n error 输入矩阵应是方阵 end e eig A 检查输入矩阵的特征值是否各异 same 0 for i 1 m 1 for j i 1 m if e j e i same 1 end end end A可以对角化的条件是A具有互异特征值或者A为埃尔米特矩阵 if any any A A end v d eig A S v 2 把这两个函数文件存放于用户自己的目录 d mywork 并在 MATLAB 中运行检验 exm2 S 1 0000 0 0 0 0 7071 0 7071 0 0 7071 0 7071 3 生成独立的外部可执行程序 在 MATLAB 指令窗中 运行如下指令 mcc m exm2 exm2 f 4 打开 DOS 窗口 在 d mywork 目录下 运行 exm2 exe 得如图 12 3 2 1 的结果 图 12 3 2 1 在 DOS 窗口运行生成程序 exm2 exe 所得的结果 12 4编译指令 mcc 简介 12 4 1 mcc 的基本调用格式 12 4 2 mcc 的选项标志 12 4 2 1 编译器 2 0 选项简介 12 4 2 2 在命令行中指定选项标志 例 12 4 2 2 1 假设当前目录上存在一个文件 exm3 m 现要求利用 M 编译器将它转换为 C 语言的源码文件 并要求将原 M 文件中那注释区的内容作为所得 C 源码文件的注 释 mcc t L Cpp A annotation comments exm3 得到 exm3 cpp 和 exm3 hpp 12 4 2 3 设置缺省选项 例 12 4 2 3 1 假设已在 d mywork 下创建了文本文件 mccstartup 请注意 该文件不可 带扩展名 该文件的内容包括若干编译指令的选项 现要求利用该文件 从 exm3 m 出 发得到 C 语言的源文件 cd d mywork 将 d mywork 设为当前工作目录 type mccstartup 打印文本文件 mccstartup 的内容 t L C A annotation none copy mccstartup h y9857 temp 将 mccstartup 转移到临时目录下 copy exm3 m h y9857 temp 将待编译 M 源码转移到临时目录下 del mccstartup 删除 mccstartup del exm3 删除原有的编译后文件 dir mccstartup 当前目录下是否含有 mccstartup dir h matlab53 bin mccstartup bin 下是否含该文件 dir exm3 当前目录下是否含有 exm3 1 file s copied 1 file s copied mccstartup not found h matlab53 bin mccstartup not found exm3 not found copy h y9857 temp exm3 m d mywork mcc L Cpp exm3 1 file s copied Error The options specified will not generate any output files Please use one of the following options to generate an executable output file x generates a MEX file executable using C m generates a stand alone executable using C p generates a stand alone executable using C S generates a Simulink MEX S function using C Or type mcc for more usage information Error in H MATLAB53 toolbox compiler mcc dll copy h y9857 temp mccstartup d mywork 将 mccstartup 拷贝到当前目录 mcc L Cpp exm3 dir exm3 del mccstartup 1 file s copied exm3 cpp exm3 hpp exm3 m 12 4 2 4 编译器 1 2 选项简介 例 12 4 2 4 1 要求利用 1 2 版编辑器对文件 exm4 m 进行操作 目标是获得 C MEX 文件 和 C 语言的独立可执行文件 1 在 5 3 版 MATLAB 指令窗中的执行指令 mcc V1 2 exm4 mcc V1 2 em exm4 2 为完成同样任务在 5 2 版指令窗中的执行指令 mcc exm4 mcc em exm4 12 5编译文件的性能优化 12 5 1优化原 M 文件的性能 12 5 1 1 提高向量化程度 例 12 5 1 1 1 本例演示 M 文件与 MEX 文件 向量运算与循环运算的速度比较 1 编写如下两类函数 M 文件 function y sa x x x x 0 eps y sin x x function y saf x n length x for k 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 进行编译 cd d mywork mcc x sa mex mcc x saf mex 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 2 4 6 8 图 12 5 1 1 1 disp 运算速度比较 disp sa m saf m sa mex dll saf mex dll disp tt 运算速度比较 sa m saf m sa mex dll saf mex dll 0 3300 2 9100 0 3800 2 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 为名 将之保存在当前目录下 function y saf x n length x x zeros 1 n y zeros 1 n for k 1 n x k x k x k 0 eps y k sin x k x k end 2 产生编译文件 mcc x saf mex mcc x saf 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 m saf pro m saf mex dll saf pro mex dll disp tt 运算速度比较 saf m saf pro m saf mex dll saf pro mex dll 2 8600 0 6600 2 6300 0 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 文件运行速度的不同 0 3 041021 yxxyxkk 1 利用 MATLAB 编辑窗口编写如下 M 函数文件 function x y m henon n x zeros 1 n y zeros 1 n for k 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 进行编译如下 cd d mywork mcc x mex20 henon 用 2 0 编译器产生普通 MEX 文件 mcc V1 2 ri ri mex12 henon 用 1 2 编辑器产生优化的 MEX 文件 3 计算各文件运行时间费用的相对值 n 10000 t zeros 3 2 for k 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 filename blanks 3 blanks 3 num2str t blanks 产生两个空列 各文件运行开销的相对值比较表 文件名 第一次运行 第二次运行 m henon 1 0 78086 mex20 henon 0 69753 0 59259 ri mex12 henon 0 015432 0 12 5 2 2 利用变量类型申明优化性能 12 5 2 3 利用编译注记优化性能 例 12 5 2 3 1 编译注记 ivdep 的应用举例 1 编写如下两个函数 M 文件 并存放在 d mywork 目录上 ivdep0 m function A ivdep0 A 1 10 A 5 9 A 3 7 ivdep m function A ivdep A 1 10 ivdep A 5 9 A 3 7 2 分别对这两个文件进行编译 cd d mywork mcc V1 2 ivdep0 mcc V1 2 ivdep 3 在 MATLAB 指令窗中运行以下指令 tic A0 ivdep0 t0 toc tic A ivdep t toc t0 4 显示结果 A0 A disp 使用编译注记 ivdep 后的运用时间仅为原来的 num2str t A0 1 2 3 4 3 4 5 6 7 10 A 1 2 3 4 3 4 3 4 3 10 使用编译注记 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 function LLS Ae 5 Av 2 A b LLSDATA Ae Av x A b 以下都是为获得较清晰的显示而编写 S 恰定 if Ae Av S 超定 elseif AeAe 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 disp 被分析矩阵 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 文 件的第和行之间插入以下两行指令 而 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 文件第和行中间插入如下一条指令即可 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 创建一个求一元函数 局部最小值的独立外部应用程序 sin 16 0 xey 1 为了让读者了解函数 对将生成的 EXE 文件的运行结果正确性做 si 6 0 x 直观的判断 先运行以下指令绘制如图 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 0 1 2 3 4 5 图 12 6 3 4 1 函数 在 2 附近的局部最小值 sin 6 0 xey 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 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 Templib T link exe fileinc c mrank 3 在 DOS 中分别运行 mrank exe 和 fileinc exe 的结果如图 12 6 3 5 1 图 12 6 3 5 1 混合源码产生的 mrank exe 和 fileinc exe 运行结果 12 7API 应用程序接口 12 7 1 MEX 文件 12 7 2数据的输入输出 12 7 2 1 数据输入 12 7 2 2 数据输出 12 7 2 3 不同平台间数据传递 12 7 3 MATLAB 引擎 例 17 7 3 1 在 C 源程序中调用 MATLAB 引擎来计算三次多项式 的根 523 x 1 编写源程序 engexam c include include include include engine h int PASCAL WinMain HANDLE hInstance HANDLE hPrevInstance LPSTR lpszCmdLine int nCmdShow Engine ep mxArray P NULL r NULL char buffer 301 double poly 4 1 0 2 5 三次多项式的系数 启动本机 MATLAB引擎 如果出错则退出程序 如想启动远程主机上的 MATLAB 则用相应主机名代替 0 if ep engOpen 0 fprintf stderr nCan t start MATLAB engine n return EXIT FAILURE 创建变量 P 将 poly变量中定义的多项式系数值拷贝至该变量 P P mxCreateDoubleMatrix 1 4 mxREAL 给变量 P取名为 p 将 P传递到引擎空间 p 将被运用于 MATLAB表达式中 mxSetName P p memcpy char mxGetPr P char poly 4 sizeof double engPutArray ep P 利用 MATLAB求解多项式根 并写至缓冲区 engOutputBuffer ep buffer 300 engEvalString ep r roots p 将缓冲区中的内容输出屏幕窗口 关闭 MATLAB引擎 释放指针 P MessageBox NULL buffer Engexam c 多项式 x 3 2x 5的根 MB OK engClose ep mxDestroyArray P return EXIT SUCCESS 2 编译连接源程序 mex f h matlab53 bin bccengmatopts bat engexam c 3 运行 engexam exe 图 12 7 3 1 运行程序 engexam exe 得到的信息窗口
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!