第六部分 M文件和面向对象编程.doc_第1页
第六部分 M文件和面向对象编程.doc_第2页
第六部分 M文件和面向对象编程.doc_第3页
第六部分 M文件和面向对象编程.doc_第4页
第六部分 M文件和面向对象编程.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 第六部分第六部分 M 文件和面向对象编程文件和面向对象编程 假如读者想灵活运用 MATLAB 去解决实际问题 想充分调动 MATLAB 科学技术 资源 想理解 MATLAB 版本升级所依仗的基础 那么本章内容将十分有用 本章将涉及比较深层的 MATLAB 内容 脚本 函数 一般函数 内联函数 子函数 私用函数 方法函数 函数句柄的创建和使用 程序调试和剖析 数据结构 类 对象 重载和继承 面向对象编程 本章配备了许多精心设计的算例 这些算例是完整的 可直 接演练的 读者通过这些算例 将真切感受到抽象概念的内涵 各指令间的协调 将从感 知上领悟到面向对象编程的优越和至关要领 本章新增了第 6 7 节 专门阐述函数句柄的创建和使用 它适用于 MATLAB6 x 版 而新增的第 6 9 3 节中关于程序性能优化的内容 则仅适用于 MATLAB6 5 以后版 6 1 入门入门 本小节将通过编写脚本文件和函数文件来解决一个具体问题 通过这两个文件 可以 初步了解 M 文件 对于其中所涉及到的各种语言结构将在后面做详细介绍 例 6 1 1 通过 M 脚本文件 画出下列分段函数所表示的曲面 15457 0 117575 0 15457 0 21 5 175 3 75 0 21 6 21 5 175 3 75 0 21 1 2 1 2 2 2 1 2 2 1 2 1 2 2 xxe xxe xxe xxp xxx xx xxx 1 编写 M 脚本文件的步骤 图 6 1 1 a 打开文件编辑 如上 输入如下一段程序 exm0601 1 m exm0601 1 m a 2 b 2 clf x a 0 2 a y b 0 2 b for i 1 length y for j 1 length x if x j y i 1 z i j 0 5457 exp 0 75 y i 2 3 75 x j 2 1 5 x j elseif x j y i 1 z i j 0 5457 exp 0 75 y i 2 3 75 x j 2 1 5 x j else z i j 0 7575 exp y i 2 6 x j 2 2 end end end axis a a b b min min z max max z colormap flipud winter surf x y z b 点击编辑调试器工具条的保存图标 键入新编文件名 如exm0601 1 完成文件的 保存 2 运行文件 a 使 exm0601 1 所在目录成为当前目录 或让该目录处在 matlab 的搜索路径上 b 然后在指令窗运行指令 文件名 便可得到图形 exm0601 1 图 6 1 2 例 6 1 2 通过 M 函数文件画出上例分段函数的曲面 整个编程步骤和前面的相同 这里将演示如何在 exm0601 1 m 的基础上产生函数文件 exm0601 2 m 1 在编辑调试器中 把 exm0601 1 m 另存为 exm0601 2 m 2 用下面 4 行指令代替原文件的第条指令 function exm0601 2 a b This is my second example a Define the limit of variable x b Define the limit of variable y 3 保存修改后的 exm0601 2 m 文件 4 在指令窗中 运行以下指令 就能产生与图 6 1 2 完全相同的图形 exm0601 2 2 2 6 2M 文本编辑器文本编辑器 Matlab Editor Debugger 是一个集编辑与调试两种功能于一体的工具环境 利用它不仅 可以完成基本的文件编辑操作 还可以对 M 文件进行调试 这里先介绍它的文件编辑功能 调试功能在后面介绍 1 为创建新 M 文件 启动编译器的 3 种操作方法 a 在指令窗中运行指令 edit b 点击指令窗工具条上的新建文件图标 c 利用指令窗的 File New 子菜单 再从右拉菜单中选择 M file 项 2 打开已经有的 M 文件的 3 种操作方法 a 在指令窗中运行指令 edit filename filename 是待打开的文件名 可不带扩展名 b 通过指令窗工具条上的打开图标 再从对话框中点选所需打开的文件 c 利用指令窗的 File Open 子菜单 再从对话框中点选所需打开的文件 3 文件保存方法 略 3 6 3MATLAB 控制流控制流 Matlab 提供了 5 种控制程序流的结构 for 循环结构 while 循环结构 if else end 分 支结构 以及 switch case 结构 try catch 结构 matlab 的这 5 种控制指令用法与其他语言 的十分类似 6 3 1 for 循环结构循环结构 for x array commands end 说明 for 指令后的变量 x 称为循环变量 而 for 与 end 之间的组命令称为循环体 循环体循环体 被重复执行的次数是确定的 该次数由被重复执行的次数是确定的 该次数由 for 指令后面的数组指令后面的数组 array 的列数决定 的列数决定 换言之 循环变量依次取数组的各列 对于每个变量值 循环体被执行一次 例 6 3 1 1 一个简单的 for 循环示例 for i 1 10 i 依次取依次取 1 2 10 x i i 对每个对每个 I 值 重复执行由该指令构成的循环体值 重复执行由该指令构成的循环体 end x 要求显示运行后数组 x 的值 x 1 2 3 4 5 6 7 8 9 10 说明 1 在 for 后面的表达式中的数组可以为任何合法的 matlab 数组 2 循环结构可以嵌套使用 3 为了得到高效代码 应尽量提高代码的向量化程度 而避免使用循环结构 4 为了得到高效代码 在循环指令之前应尽量对数组进行预定义 6 3 2 while 循环结构循环结构 while expression commands end 例 6 3 2 1 Fibonacci 数组的元素满足 Fibonacci 规则 12 kkk aaa 且 现要求该数组中第一个大于 10000 的元素 2 1 k1 21 aa a 1 1 a 2 1 i 2 while a i 8 sums number 0 95 cost end sums sums 114 0000 例 6 3 3 2 用 for 循环指令来寻求 Fibonacc 数组中第一个大于 10000 的元素 n 100 a ones 1 n for i 3 n a i a i 1 a i 2 if a i 10000 a i break 跳出所在的一级循环跳出所在的一级循环 end end i ans 10946 i 21 6 3 4 switch case 结构结构 switch case 指令的一般语法结构形式如下 switch ex ex 为一标量或字符串 case test1 commands 1 当 ex 等于 test1 时 执行组命令 1 然后跳出该结构 case test2 5 case testk commands k 当 ex 等于 testk 时 执行组命令 k 然后跳出该结构 otherwise otherwise 指令可以不存在 commands 表达式不等于前面所有检测值时 则执行该组命令 end 说明 1 switch 指令后面的表达式应为一个标量或者为一个字符串 对于标量形式的表达式 比较这样进行 表达式 检测值 I 而对于字符串 matlab 将调用函数 strcmp 来实现比较 strcmp 表达式 检测值 i 2 case 指令后面的检测值不仅可以为一个标量值或者为一个字符串 还可以为一个元胞指令后面的检测值不仅可以为一个标量值或者为一个字符串 还可以为一个元胞 数组 如果一个检测值是一个元胞数组 数组 如果一个检测值是一个元胞数组 matlab 将把表达式的值和该元胞数组中的所有元将把表达式的值和该元胞数组中的所有元 素进行比较 如果元胞数组中某个元素和表达式的值相等 素进行比较 如果元胞数组中某个元素和表达式的值相等 matlab 认为此次比较结果为真 认为此次比较结果为真 从而执行与该检测值相应的一组命令 从而执行与该检测值相应的一组命令 见下例 见下例 例 6 3 4 1 学生的成绩管理 用来演示 switch 结构的应用 clear 划分区域 满分 划分区域 满分 100 优秀 优秀 90 99 良好 良好 80 89 及格 及格 60 79 不及格 不及格 2 error 输入宗量太多 end if nargin 1 s b end clf t 0 pi 100 2 pi x r exp i t if nargout 0 plot x s else sa pi r r fill real x imag x s end axis square 说明 1 从结构上看 M 脚本文件仅比 M 函数文件少一个 函数申明行 其余各部分的构造 和作用都相同 2 函数定义名和保存文件名一致 两者不一致时 matlab 将忽视文件首行的函数定义名 而以保存文件名为准 3 函数文件的名字必须以字母开头 后面可字母 下划线以及数字的任意组合 但不得 超过 31 个字符 4 建议在编写 H1 行时 如上例那样才用英文表达 这样处理是为了以后关键词检索方便 6 4 5 P 码文件码文件 6 4 5 1语法分析过程和伪代码语法分析过程和伪代码 一个 M 文件首次被调用 运行文件名 或被 M 文本编辑器打开 时 matlab 将首先 对该 M 文件进行语法分析 Parse 并把生成的相应内部伪代码 Psedecode 简称 P 码 文件存放在内存中 此后 当再次调用该 M 文件时 将直接调用该文件在内存中的 P 码文 件 而不会对原码文件重复进行语法分析 值得注意的是 值得注意的是 matlab 的分析器 的分析器 Parse 总 总 是把是把 M 文件连同被它调用的所有函数文件连同被它调用的所有函数 M 文件一起变换成文件一起变换成 P 码文件的 码文件的 P 码文件有与原码文件相同的文件名 但其扩展名是 p 本质上说 P 码文件运行 速度高于原码文件 在 matlab 中 假如存在同名的 P 码和原码文件 那么当该文件名被调用时 被执行的肯定 是 P 码文件 6 4 5 2P 码文件的预生成码文件的预生成 P 码文件不是仅当 M 文件被调用时才可产生 P 码文件也可被预先生成 具体如下 pcode FunName 在当前目录上生成 FunName p pcode FunName inplace 在 FunName m 所在目录上生成 FunName p 6 4 5 3内存中内存中 P 码文件的列表和清除码文件的列表和清除 10 inmem 罗列出内存中所有 P 码文件名 clear FunName 清除内存中的 FunName pP 码文件 clear functions 清除内存中的所有 P 码文件 6 4 6 MATLAB 的搜索过程的搜索过程 假设 matlab 在一个文件中碰到指令 cow 时 它将按以下步骤逐步进行检索 matlab 在内存中进行检查 看在内存中进行检查 看 cow 是不是变量 假如不是 进入下一步 是不是变量 假如不是 进入下一步 检查检查 cow 是不是内建函数 是不是内建函数 Built in Function 假如不是 再往下执行 假如不是 再往下执行 检查检查 cow 是不是是不是 cow 所在的所在的 M 文件中的一个子函数 假如 再往下执行 文件中的一个子函数 假如 再往下执行 检查检查 cow 是不是是不是 cow 所在的所在的 M 文件中的一个私用函数 先找文件中的一个私用函数 先找 cow p 然后是然后是 cow m 假 假 如 再往下执行 如 再往下执行 检查检查 cow 是不是当前目录上的文件 先找是不是当前目录上的文件 先找 cow p 然后是然后是 cow m 假如 再往下执行 假如 再往下执行 在在 matlab 搜索路径的其他目录上 检查是否有名为搜索路径的其他目录上 检查是否有名为 cow 的的 M 文件存在 先找文件存在 先找 cow p 然然 后是后是 cow m matlab 将使用最先找到的那个将使用最先找到的那个 cow 如果一直找不到 如果一直找不到 cow matlab 就给出错误提示信息 就给出错误提示信息 6 5变量的检测传递和限权使用函数变量的检测传递和限权使用函数 6 5 1 输入输出宗量检测指令输入输出宗量检测指令 nargin 在函数体内 用于获取实际输入宗量 nargout 在函数体内 用于获取实际输出宗量 nargin fun 获取 fun 指定函数的标称输入宗量数 nargout fun 获取 fun 指定函数的标称输出宗量数 inputname n 在函数体内使用 给出第 n 个输入宗量的实际调用变量名 说明 1 在函数体内使用 nargin nargout 的目的是 与程序流控制指令配合 对于不同数目的 输入输出宗量数 函数可完成不同的任务 2 应注意 nargin nargout inputname 本身都是函数 而不是变量 所以不能使用赋值 指令对它们进行处理 6 5 2 变长度变长度 输入输出宗量输入输出宗量 在 matlab 中有相当一些函数 都具有接受 任意多输入 返回 任意多输出 的能 力 如前面已经使用过的 plot 绘图指令 就允许使用任意多的 属性名 属性值对 精细指 定 plot 绘图的用线 为了使用户的自编函数也具备这种能力 matlab 提供如下两个内状函数 varargin 变长度 输入宗量列表 varargout 变长度 输出宗量列表 说明 1 编写 M 函数文件时 函数申明行中的 变长度 宗量必须被放置在 普通 宗量之后 2 varargin 的工作机理 1 narargin 本身是个元胞数组 2 M 文件被调用时 函数输入变量的分配规则是 首先 输入变量依先后次序逐 个对应分配给 M 函数文件输入宗量列表中那些被明确定义的 普通 输入宗 量 然后 把剩余的输入变量依次逐个分配到 varargin 元胞数组的元胞中 因 11 此 varargin 元胞数组的长度取决于分配到的输入变量数 3 所谓 变长度 就是指 varargin 的长度随分配到的输入变量数而变 4 narargout 的工作机理 规则与 narargin 相同 例 6 5 2 1 变长度宗量使用示例 本例演示 编写程序 画两个同心圆环 其中一个 半径由独立输入宗量定义 另一个由变长度输入宗量的第一个元素定义 可以用任意指定 的色彩 线型绘制 变长度输入输出宗量在程序中的构成和使用 变长度输入输出宗 量的对外使用表现 1 编写函数文件 exm06052 1 m exm06052 1 m function varargout exm06052 1 r varargin RINGZYPlot a ring and calculate the area of the ring r 基圆半径 调用格式 x1 y1 x2 y2 s1 s2 exm06052 1 r r2 PropertyName PropertyValue 1 无输出时 绘圆回环 2 有输出时 不绘图 x1 y1 x2 y2 分别是两个圆的坐标点 s1是基圆面积 s2为正值时 表示内环面积 为负值时 表示外环面积 vin length varargin Nin vin 1 计算输入变量数目 error nargchk 1 Nin nargin 检查输入变量数目是否合适 if nargout 6 检查输出变量数目是否合适 error Too many output arguments end t 0 pi 20 2 pi x r exp i t s pi r r if nargout 0 switch Nin case 1 plot x b case 2 r2 varargin 1 x2 r2 exp i t plot x b hold on plot x2 b hold off otherwise r2 varargin 1 x2 r2 exp i t plot x varargin 2 end hold on 利用元胞叔祖设置对象属性 plot x2 varargin 2 end hold off 利用元胞叔祖设置对象属性 end axis square else varargout 1 real x varargout 2 imag x varargout 5 pi r r varargout 6 if Nin 1 r2 varargin 1 x2 r2 exp i t varargout 3 real x2 varargout 4 imag x2 varargout 6 pi r 2 r2 2 end end 12 2 有输出情况 自己用 plot x1 y1 x2 y2 检验下列 3 个调用示例的运行结果 r1 1 r2 3 x1 y1 x2 y2 s1 s2 exm06052 1 r1 x1 y1 x2 y2 exm06052 1 r1 r2 x1 y1 x2 y2 s1 s2 exm06052 1 r1 r2 3 无输出情况 为节省篇幅 在此给出了 3 个调用示例 r1 1 r2 0 6 subplot 1 3 1 exm06052 1 r1 r2 subplot 1 3 2 exm06052 1 r1 r2 Marker o subplot 1 3 3 exm06052 1 r1 r2 LineWidth 5 Color 1 0 4 0 01 0 5 1 0 0 5 1 5 图 6 5 1 变长度输入宗量不同调用格式产生的图形 说明 应注意上例中标有号码的各条相应指令是如果调用 varargin 每个元胞的内容 以及如 何向 varargout 每个元胞放置内容的 6 5 3 跨空间变量传递跨空间变量传递 6 5 3 1跨空间计算串表达式的值跨空间计算串表达式的值 前面已经介绍了实现不同工作空间之间变量传递的两种渠道 函数的输入输出宗量和 全局变量 这里见介绍第 3 个传递渠道 跨空间计算串表达式值的指令 格式是 evalin worspace expression 跨空间计算串表达式值 evalin worspace expression1 expression2 跨空间计算替代串表达式值 说明 1 worspace 可取两个值 base 和 caller 2 第 1 种调用格式的执行机理是 1 当 worspace 取 base 时 表示计算 eval expression 时 将从基本工作空间获得 变量值 2 当 worspace 取 caller 时 表示计算 eval expression 时 将从主调函数空间获 得变量值 主调函数是相对被调函数而言的 这里被调函数是指 主调函数是相对被调函数而言的 这里被调函数是指 evalin 所在所在 的函数 的函数 3 第 2 种调用格式的执行机理是 先从所在函数空间获取变量值 用 eval expression1 计算原串表达式 如若该计算失 败 则再从 workspace 指定的 基本或主调函数 工作空间获取变量值 再通过 eval expression2 计算替代串表达式 例 6 5 3 1 1 本例演示 A 编写绘制正多边形或圆的程序 B 子函数与 母 函 数的关系 C 各种不同的工作空间 D evalin 运行机理与 eval 的异同 1 编写 M 函数文件 13 exm060531 1 m function y1 exm060531 1 a s t 0 a a 2 pi y1 subevalinzzy 4 s subfunction function y2 subevalinzzy a s t 0 a a 2 pi ss a exp i t switch s case base caller y2 evalin s ss case self y2 eval ss end 2 在 maltab 指令窗中运行以下指令 clear a 30 t 0 a a 2 pi sss base caller self for k 1 3 y0 exm060531 1 8 sss k subplot 1 3 k plot real y0 imag y0 r LineWidth 3 axis square image end 0 0 0 0 5 0 0 4 图 6 5 2 利用不同工作空间中的变量值计算eval a exp i t 说明 1 本例运行时 有 3 个空间 基本空间 主函数空间 子函数空间 在每个空间里 都 有各自不同的 a t 值 2 本例的 3 脏子图显示 虽 eval a exp i t 的计算 都在子函数 subevalinzzy 中 进行 但由于取不同工作空间的 a t 值 所以产生的结果也不同 在基本空间中 产 生圆 在主函数空间中 产生八边形 在子函数空间中 产生四边形 6 5 3 2跨空间赋值跨空间赋值 实现不同工作空间之间变量传递的第四个传递渠道 跨空间赋值指令 格式是 assignin workspace VN x 跨空间向 VN 变量赋值 说明 把当前工作空间内变量 x 的值赋给 workspace 指定空间的名 VN 变量 例 6 5 3 2 1 assignin 运作机理示范 1 编写 M 函数文件 exm060532 1 m function y exm060532 1 x y sqrt x t x 2 14 assignin base yy t 2 在 matlab 指令窗中运行以下指令 clear x 4 y exm060532 1 x disp blanks 5 x blanks 5 y blanks 4 yy disp x y yy x y yy 4 2 16 说明 本例运行后 基本空间内的 y 变量值是通过函数 exm060532 1 m 的输出宗量送出的 而 yy 变量却是由该函数中的跨空间赋值指令直接产生 6 5 4 子函数子函数和和私用函数私用函数 6 5 4 1子函数子函数 matlab 允许 1 个 M 函数文件包含多个函数的代码 其中 第一个出现的那个函数称为 主函数 该文件中的其他函数则称为子函数 保存时所用文件名与主函数定义名相同 外 部程序只能对主函数进行调用 子函数的主要性质 1 在 M 函数文件内 主函数的位置不可改变 子函数的排列次序可以任意改变 2 子函数只能被处于同一文件的主函数或子函数调用 3 在 M 函数文件内 任何指令通过 名字 对函数进行调用时 子函数的优先 级仅次于内装函数 4 同一文件的主函数 子函数的工作空间都是彼此独立的 各函数间的信息 或同一文件的主函数 子函数的工作空间都是彼此独立的 各函数间的信息 或 通过输入输出宗量传递 或通过全局变量传递 或通过跨空间指令传递 通过输入输出宗量传递 或通过全局变量传递 或通过跨空间指令传递 5 help lookfor 等帮助指令都不能提供关于子函数的任何帮助信息 6 5 4 2私用函数私用函数 所谓私用函数 是指位于 private 目录上的 M 文件函数 性质是 1 私用函数的构造完全与普通 M 函数相同 2 私用函数只能被 private 直接父目录上的 M 文件所调用 而不能被其他目录上 的任何 M 文件或 matlab 指令窗中的命令所调用 3 在 M 函数文件内 任何指令通过 名字 对函数进行调用时 私用函数的优 先级虽低于内装函数和子函数 但高于其他任何目录上的函数 4 help lookfor 等帮助指令都不能提供关于私用函数的任何帮助信息 6 6串演算函数串演算函数 指令 表达式 语句 以及由它们综合组成的 M 文件 是用户为达到自己计算目的时 所最常使用的形式 为提高计算的灵活性 matlab 还提供了一种利用字符串进行计算的能 力 利用字符串可以构成函数 可以在运行中改变所执行的指令 可以被泛函数指令调用 实现比较复杂的求零点 求极值等运算 6 6 1 eval y eval CEM 执行 CEM 指定的计算 y eval CEM1 CEM2 先执行 CEM1 指定的计算 如果出错 就执行 CEM2 y1 y2 eval CEM 执行时对 CEM 代表的函数文件调用 并输出计算结果 说明 1 eval 指令的输入宗量必须是字符串 15 2 构成字符串的 CEM 可以是 matlab 任何合法的指令 表达式 语句或 M 文件名 3 第 3 种格式中的 CEM 只能是 包含输入宗量在内的 M 函数文件名 例 6 6 1 1 计算 表达式 串 产生向量值 clear t pi cem t 2 t 2 sin t y eval cem y 1 5708 6 2832 0 0000 例 6 6 1 2 计算 语句 串 创建变量 clear t pi eval theta t 2 y sin theta who theta 1 5708 y 1 Your variables are t theta y 6 6 2 feval y1 y2 feval FN arg1 arg2 用参量 arg1 arg2 等执行 FN 函数指定的计算 说明 1 FN 只能是函数名 2 在既可以使用 eval 又可以使用 feval 的情况下 feval 运行效率更高 3 feval 主要用来构造 泛函 型 M 函数文件 如 fmin ezplot 4 例 6 6 2 1 feval 和 eval 运行区别之一 feval 的 FN 绝对不能是表达式 x pi 4 Ve eval 1 sin x Ve 1 7071 Vf feval 1 sin x x Error using feval Invalid function name 1 sin x 例 6 6 2 2 feval 和 eval 调用区别 feval 的 FN 只接受函数名 本例两种方法以后者为 好 randn seed 1 A rand 2 2 ue de ve eval svd A disp Results by eval disp ue de ve disp blanks 1 uf df vf feval svd A disp Results by feval disp uf df vf Results by eval 0 9193 0 3936 1 2212 0 0 7897 0 6135 0 3936 0 9193 0 0 2633 0 6135 0 7897 Results by feval 0 9193 0 3936 1 2212 0 0 7897 0 6135 0 3936 0 9193 0 0 2633 0 6135 0 7897 6 6 3 内联函数内联函数 内联函数是 matlab 提供的一个对象 它的形状表现和函数文件一样 而内联函数的创 建则比较容易 6 6 3 1内联函数的创建内联函数的创建 16 inline CE 把串表达式转化为输入宗量自动生成的内联函数 inline CE arg1 arg2 把串表达式转化为 arg1 arg2 等指定输入宗量的内联函数 inline CE n 把串表达式转化为 x P1 P2 Pn 等指定输入宗量的内联函 数 说明 1 CE 是字符串 CE 必须是不包含赋值号 的表达式 2 第 1 中调用格式将按一定规则自动对 CE 进行辩识 3 第 2 种调用格式是创建内联函数的最稳妥 可靠的途径 输入宗量字符可以表达得更 自如 4 第 3 种调用格式最简练 但对输入宗量的字符限制严格 输入宗量字符只能是 x P1 P2 Pn 等 注意 P 是大写 5 内联函数也可以看做是沟通 eval feval 两个不同指令的 桥梁 凡是 eval 可以运作的 表达式 都可以通过 inline 转化为内联函数 而这种内联函数总可被 feval 使用 Matlab 的许多 泛函 函数 就是由于采用了 inline 而具备了适应各种被处理函数形 式的能力 6 6 3 2涉及内联函数性质的指令涉及内联函数性质的指令 class inline fun 给出内联函数类型 char inline fun 给出内联函数计算公式 argnames inline fun 给出内联函数的输入宗量 vectorize inline fun 使内联函数适用 数组运算 规则 6 6 3 3内联函数创建和应用示例内联函数创建和应用示例 例 6 6 3 3 1 演示 内联函数的第一种创建格式 使内联函数适于 数组运算 clear F1 inline sin rho rho 第一种格式创建内联函数 F1 Inline function F1 rho sin rho rho f1 F1 2 内联函数的一种使用方法 f1 0 4546 FF1 vectorize F1 产生适于产生适于 数组运算数组运算 的内联函数的内联函数 xx 0 5 1 1 5 2 ff1 FF1 xx FF1 Inline function FF1 rho sin rho rho ff1 0 9589 0 8415 0 6650 0 4546 例 6 6 3 3 2 演示 第一种内联函数创建格式的缺陷 含向量的多宗量输入的赋值 G1 inline a exp x 1 cos x 2 G1 2 1 pi 3 G1 Inline function G1 a a exp x 1 cos x 2 Error using inline subsref Too many inputs to inline function G2 inline a exp x 1 cos x 2 a x G2 2 1 pi 3 G2 Inline function G2 a x a exp x 1 cos x 2 ans 0 3679 例 6 6 3 3 3 演示 产生向量输入 向量输出的内联函数 这种向量函数的调用方法 Y2 inline x 1 2 3 x 1 sin x 2 argnames Y2 观察内联函数的输入宗量 17 Y2 Inline function Y2 x x 1 2 3 x 1 sin x 2 ans x x 4 pi 6 向量输入形式的赋值向量输入形式的赋值 y2 Y2 x 获得向量输出 y2 16 0000 6 0000 例 6 6 3 3 4 演示 最简练格式创建内联函数 内联函数可被 feval 指令调用 Z2 inline P1 x sin x 2 P2 2 Z2 Inline function Z2 x P1 P2 P1 x sin x 2 P2 z2 Z2 2 2 3 直接计算内联函数直接计算内联函数 fz2 feval Z2 2 2 3 注意 这里应写成 Z2 不能写成 Z2 z2 2 6279 fz2 2 6279 6 7函数句柄函数句柄 函数句柄是 matlab6 x 版启用的新数据类型 它保存着为该函数创建句柄时的路径 视 野 函数名 以及可能存在的重载方法 引入函数句柄的目的是 使 feval 及借助于它的泛函指令工作更可靠 使 函数调用 象变量调用一样灵活方便 可迅速获得同名重载函数的位置 类型信息 可在更大范围内 调用子函数和私有函数 提高软件重用性 提高函数调用速度 特别在反复调用情况下更 显效率 6 7 1 函数句柄的创建和观察函数句柄的创建和观察 函数句柄并不是伴随函数文件而自动形成的文件 属性 它必须通过专门的定义才会 生成 为一个函数定义句柄有两种方法 利用 符号或利用转换函数 str2func 对函数句柄的内涵观察需要借助专门指令 functions 实现 对此 要特别强调的是 1 创建函数句柄时 被创建句柄的函数文件必须在当前视野范围内 所谓当前视 野包括 当前目录 搜索路径 当前目录所包含的 私用文件夹 此外 如 果创建函数句柄的指令在一个函数文件中 那么该文件包含的所有子函数 也 在当前视野内 2 假如被创建句柄的函数不在当前视野内 则所创建的函数句柄无效 对于这种 无效创建 matlab 既不会发布 出错 信息 也不会给出任何警告 例 6 7 1 1 为 MATLAB 的 内建 函数创建函数句柄 并观察其内涵 1 创建函数句柄 hsin sin 2 类型判别 class hsin size hsin ans function handle ans 1 1 18 3 借助指令 functions 观察句柄的内涵 CC functions hsin CC function sin type overloaded file MATLAB built in function methods 1x1 struct 4 同名重载函数观察 CC methods sym ans d matlab6p5 toolbox symbolic sym sin 说明 1 指令 hsin sin 的功能可以用 hsin str2func sin 替代 2 定义函数句柄时 所指定的函数名不应该包括路径信息 也不应该包括扩展名 函数名最多 只能包括 63 个字符 3 本例对 hsin 的检查表明 它是 1x1 的 函数句柄 数组 5 观察指令 functions 只能接受 1x1 的函数句柄数组 并返回一个单构架 该返回构架 包含若干个域 记录着各种信息 详见下表 表 6 1 functions 指令返回构架中各域的名称 可能取值和含义 域名说明 function 句柄所代表的函数名 simple 无重载的内建函数 M P 函数文件 或无法判断类型的函数 subfunction 子函数 private 私有函数 constructor Matlab 类的对象构造函数 type 函 数 类 型 overloaded 有重载的函数 file 非重载数据类型所对应的源代码及路径 假如存在内建函数 则总列在此栏 methods 仅当函数类型为 overloaded 时 返回构架才具有该域 该域本身又是一个构架 其子域 分别记录着所有的所有的重载函数及路径 6 7 2 函数句柄的基本用法函数句柄的基本用法 这里将介绍如何通过函数句柄执行相应函数的计算 假设一个函数的调用格式为 argout1 argout2 argoutn Funname argin1 argin2 arginn 又假设该函数的句柄通过指令 Hfun FunName 获得 那么通过函数句柄实现函数运算的调用格式是 argout1 argout2 argoutn feval Hfun argin1 argin2 arginn 说明 1 一旦函数句柄被有效建立 无论名为一旦函数句柄被有效建立 无论名为 FunName 的函数文件是否在当前搜索路径上 是的函数文件是否在当前搜索路径上 是 否在当前视野范围内 是否是子函数或私有函数 只要运用句柄否在当前视野范围内 是否是子函数或私有函数 只要运用句柄 Hfun 便总能被正确地便总能被正确地 执行 执行 2 在 FunName 存在重载函数时 借助句柄 Hfun 的计算总能被 恰当地 执行 即是说 它也会根据计算的数据类型 从其包含的所有重载含糊中选择相应的函数文件执行运 算 3 在不使用函数句柄的情况下 对在不使用函数句柄的情况下 对 FunName 进行多次调用时 每次都要为该函数进行全进行多次调用时 每次都要为该函数进行全 面的路径搜索 直接影响计算速度 借助面的路径搜索 直接影响计算速度 借助 Hfun 可完全避免这种无谓的时间消耗 可完全避免这种无谓的时间消耗 例 6 7 2 1 本例通过函数及其句柄演示若干基本用法 1 函数句柄的创建 fhandle str2func sin 19 2 函数句柄在 数值计算 中的情况 4 sin ys sin pi 4 函数直接调用函数直接调用 yfold feval sin pi 4 feval 指令的指令的 老式老式 调用调用 yfnew feval fhandle pi 4 feval 指令的指令的 新式新式 调用调用 ys 0 7071 yfold 0 7071 yfnew 0 7071 3 函数句柄在 符号计算 中的情况 Alpha sym pi 4 定义符号常数定义符号常数 yss sin Alpha 函数直接调用函数直接调用 yfold feval sin Alpha feval 指令的指令的 老式老式 调用调用 ynews feval fhandle Alpha feval 指令的指令的 新式新式 调用调用 yss 1 2 2 1 2 yfold 1 2 2 1 2 ynews 1 2 2 1 2 4 函数句柄在泛函指令中的用法 在间求 sin 函数的极小值 2 0 xold fminbnd sin 0 2 pi 泛函指令的泛函指令的 老式老式 调用调用 xnew fminbnd fhandle 0 2 pi 泛函指令的泛函指令的 新式新式 调用调用 xold 4 7124 xnew 4 7124 例 6 7 2 2 本例演示 如何避免创建 无效函数句柄 问题 1 Hy2 fhzzy fhzzy m 是随书光盘是随书光盘 mfiles 文件夹上的一个函数文件 文件夹上的一个函数文件 Hy2 fhzzy 2 class Hy2 size Hy2 ans function handle ans 1 1 3 feval Hy2 line Error using feval Undefined function fhzzy 例 6 7 2 3 自建函数及其句柄的使用 1 fhzzy m function Hr fhzzy flag fhzzy t 0 100 100 2 pi x sin t y cos t 20 Hr cirline feval Hr flag x y t subfunction function cirline wd x y t switch wd case line plot t x b t y r LineWidth 2 case circle plot x y g MarkerSize 30 axis square off otherwise error 输入宗量只能取 line 或 circle end shg 2 Hy3 fhzzy fhzzy line Hy3 fhzzy 0 4 图 6 7 1 3 which fhzzy fhzzy not found 4 fhzzy line feval fhzzy line Undefined function or variable fhzzy 5 feval Hy3 line 例 6 7 2 4 子函数句柄的创建与使用 1 HCL fhzzy circle HCL cirline 21 图 6 7 2 2 tt 0 100 100 2 pi xx sin tt yy cos tt cirline circle xx yy tt feval circle xx yy tt Undefined function or variable cirline 3 feval HCL circle xx yy tt 6 8创建用户工具箱创建用户工具箱 对于探索性问题或简单问题 在指令窗中直接操作可能是比较有效的 对于经常性问 题或复杂问题 运用 M 函数 脚本文件 会感到方便 对于学科性问题或某种问题类型 把相关的 M 文件组织成一个由目录 子目录构成的用户工具就十分必要 6 8 1 MATLAB 对工具箱文件的管理特点对工具箱文件的管理特点 1 matlab 认为其工具箱中的文件是成熟的 完整的 工具箱文件属性是 只读 的 无 日期时间 跟踪能力的 因此 若不采取特殊手段 用户对工具箱文 件的修改将不被承认和采纳 2 为了在线帮助的需要 每个 M 文件都有能被 help lookfor 检索的该文件使用 说明 3 在工具箱目录上都包含两个 非执行的 说明性 文件 Read me 和 Contents m a Read me 记录该目录文件的最新更改说明和使用注意事项 Read me 中的内容可以被任何文 件阅读软件打开 Matlab 指令窗中的在线阅读 Read me 的指令是 whatsnew ToolboxDirName 这里 ToolboxDirName 是 matlab toolbox 目录子目录的名字 比如 要看通信工具箱 comm 的最新变化 运行 whatsnew comm 便可 b Contents m 各处该工具目录上的所有文件的分类列表 从列表可知道 M 文件名和用途 Contents m 应在第 1 行指定该工具箱的名字 然后在第 2 行指定该工具箱的版本以及 创建时间的信息 Contents m 的内容也可以被任何文件阅读软件打开 Matlab 指令窗 中的在线阅读 Contents m 的指令是 help ToolboxDirName 这里 ToolboxDirName 是 matlab toolbox 目录子目录 或带孙目录 的名字 Ver 指令会给出 matlab 工具箱的版 本信息 4 matlab 工具箱的所有目录都在 matlabrc m 定义的搜索路径上 一旦 matlab 启 22 动 所有工具箱目录上的 M 文件名 文件位置都被送入 缓冲存储器 这样 作的目的是加快在线求助的响应速度 提高文件调用上时的查找速度 6 8 2 建立用户工具箱须知建立用户工具箱须知 用户在创建自己的工具箱时 应充分考虑 matlab 的管理特点 为此 建议是 1 对于自己不太成熟的 修改较为频繁的 M 文件组 可以在 matlab toolbox 目录之外建 立一个专门的 用户工具目录 同时通过路径编辑器 把该目录纳入 matlab 的搜索目录 这样处理的好处是 a 文件在搜索路径上 因此在 matlab 指令窗中可方便地调用 b matlab 对 toolbox 目录之外的 M 文件有 日期时间 跟踪比较能力 并总是使最新的 文件投入运行 2 对于成熟的文件组 也应该在配备相应的 Read me 和 Contents m 文件后 才把它们 组织到 matlab toolbox 工具箱中去 并使之处在 matlab 搜索路径上 6 9 调试和剖析调试和剖析 6 9 1 直接调试法直接调试法 6 9 2 调试器的使用调试器的使用 6 9 2 1图形式调试器图形式调试器 图 6 9 1 6 9 2 2调试器应用示例调试器应用示例 例 6 9 2 2 1 本例的目标 对于任意随机向量 画出鲜明标志该随机向量均值 标准差 的频数直方图 如图 6 9 2 或给出绘制这种图形的数据 0 3 0 5 图 6 9 2 1 exm060922 1 m function nn xx xmu xstd exm060922 1 x xmu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论