没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/85391981/bg2.jpg)
第五章 自定义函数
在第三章中,我们强调了好的编程习惯的重要性。我们进行开发的基本手段是自上而
下的编程方法。在自上而下的编程方法中,它开始于对所要解决问题的精确陈述和定义输
入量和输出量。下一步,我们在大面上进行算法的描述,然后把算法分解成一个一个的子
问题。再然后,程序员把这一个个子问题进行再一次的分解,直到分解成简单而且能够清
晰理解的伪代码。最后把伪代码转化为 MATLAB 代码。
尽管我们在前面的例子中,按照上面的步骤进行了编程。但是产生的结果在某种程度
上还是受限制的。因为我们必须把每一个子问题产生的 MATLAB 代码嵌入到一个单独的
大程序中。在嵌入之前我们无法对每一次子问题的代码进行独立地验证和测试。
幸运的是,MATLAB 有一个专门的机制,在建立最终的程序之前用于独立地开发与调
试每一个子程序。每一个子程序都可以独立函数的形式进行编程,在这个程序中,每一个
函数都能独立地检测与调试,而不受其他子程序的影响。良好的函数可以大大提高编程的
效率。它的好处如下:
1.子程序的独立检测
每一个子程序都可以当作一个独立的单元来编写。在把子程序联合成一个的大程序之
前,我们必须检测每一个子程序以保证它运转的正确性。这一步就是我们熟知的单元检测。
在最后的程序建立之前,它排除了大量的问题。
2.代码的可复用性
在许多的情况下,一个基本的子程序可应用在程序的许多地方。例如,在一个程序的
许多地方,要求对一系列按由低到高的顺序进行排序。你可以编一个函数进行排序,然后
当再次需要排序时可以调用这个函数。可重用性代码有两大好处:它大大提高了整体编程
效率,它更易于调试,因为上面的排序函数只需要调试一次。
3.远离意外副作用
函数通过输入参数列表(input argument list)从程序中读取输入值,通过输出参数列表
(output argument list)给程序返回结果。程序中,只有在输入参数列表中的变量才能被函
数利用。函数中,只有输出参数列表中的变量才能被程序利用。这是非常重要的,因为在
一个函数中的突发性编程错误只会发生错误的函数的变量。一旦一个大程序编写并发行,
它还要面临的问题就是维护。程序的维护包括修补错误,修改程序以适应新或未知的环境。
作维护工作的程序员在一般情况下不会是程序的原作者。如果程序编写的不好,改动一处
代码就可能对程序全局产生负面影响。这种情况的发生,可能是因为变量在其他部分被重
新定义或利用。如果程序员改变这个变量,可能会导致后面的程序无法使用。
好的函数的应用可以通过数据隐藏使问题最小化。在主函数中的变量在函数中是不可
见的(除了在输入变量列表中的变量),在主程序中的变量不能被函数任意修改。所以在
函数中改变变量或发生错误不会在程序的其他部分发生意外的副作用。
好的编程习惯
把大的程序分解成函数,有很多的好处,例如,程序部分的独立检测,代码的可复用
性,避免意想不到的错误。
1
![](https://csdnimg.cn/release/download_crawler_static/85391981/bg3.jpg)
5.1 MATLAB 函数简介
到目前为止,我们看到的所有的 M 文件都是脚本文件。脚本文件只是用于存储
MATLAB 语句。当一个脚本文件被执行时,和直接在命令窗口中直接键入 MATLAB 语句
所产生的结果是一样的。脚本文件分享命令窗口中的工作区,所以所有的在脚本文件运行
之前定义的变量都可以在脚本文件中运行,所有在脚本文件中创建的变量在脚本文件运行
之后仍然存在工作区。一个脚本文件没有输入参数,也不返回结果。但是所有脚本文件可
以通过存于工作区中的数据进行交互。
相对地,MATLAB 函数是一种特殊形式的 M 文件,它运行在独立的工作区。它通过
输入参数列表接受输入数据,它通过输出参数列表返回结果给输出参数列表。MATLAB 函
数的基本形式如下:
function [outarg1, outarg2, ...] = fname(inarg1, inarg2, ...)
%H1 comment line
%Other comment lines
...
(Executable code)
...
(return)
function 语句标志着这个函数的开始。它指定了函数的名称和输入输出列表。输入函数
列表显示在函数名后面的括号中。输出函数列表显示在等号左边的中括号中。(如果只有
一个输出参数,中括号可以省略。)
输入参数列表是名字的列表,这些名字代表从调用者到函数的值。这些名字被称作形
参。当函数被调用时,它们只是从调用者得来实际变量的占位符而已。相似地,输出参数
列表也形参组成,当函数结束运行时,这些形参是返回到调用者的值的占位符。
在一个表达式中,调用一个函数需要用到实参列表。在命令窗口直接(或在脚本文件
中,另一个函数中)键入函数的名字就可以调用这个函数了。当调用一个函数时,第一个
实参的值用在第一个形参的位置,而且其余的形参和实参都一一对应。
函数的执行从函数的顶部开始,结束于 return 语句或函数的终点。因为在函数执行到
结尾就会结束,所以 return 语句在大部分的程序中没有必要使用。在输出参数列表中每一
个项目都必须出现在 function 语句中的左边。当函数返回时,存储于输出函数列表的值就
会返回给调用者,用于下一步的运算。
在一个函数中的初始注释行有特定的目的。在 function 语句的第一个行注释被称为 H1
注释行。它应当是对本函数功能的总结。这一行的重要性在于,通过 lookfor 命令它能被搜
索到并显示出来。从 H1 注释行到第一个空行或第一个可执行性语句可以通过 help 命令或
帮助窗口搜索到。它们则应包含如何使用这个函数的简单总结。
下面是一个自定义函数的简单例子。函数 dist2 用于计算笛卡尔坐标系中点(x
1
,y
1
)
与点(x
2
,y
2
)之间的距离。(把以下代码保存成 dist2.m 文件)
function distance = dist2 (x1, y1, x2, y2)
%DIST2 Calculate the distance between two point
% Function DIST2 calculates the distance between
% two points (x1, y1) and (x2,y2) in a cartesian
% coordinate system.
%
% Calling sequence:
% res = dist2(x1, y1, x2, y2)
%
% Define variables:
% x1 --x-position of point 1
% y1 --y-position of point 1
% x2 --x-position of point 2
% y2 --y-position of point 2
% distance --Distance between points
2
![](https://csdnimg.cn/release/download_crawler_static/85391981/bg4.jpg)
%
% Record of revisions:
% Date Pragrammer Description of change
% ======== ========== ================
% 12/15/98 S.J.Chapman Original code
%
% Calculate distance.
distance = sqrt((x2-x1).^2 + (y2-y1).^2);
这个函数有 4 个输入参数各和 1 个输出参数。一个简单的利用这个函数的例子显示如
下:
% Script file: test_dist2.m
%
% Purpose:
% This program test2 function dist2.
%
% Record of revisions:
% Date Pragrammer Description of change
% ======== ========== ================
% 12/15/98 S.J.Chapman Original code
%
% Define variables:
% ax --x-position of point a
% ay --y-position of point a
% bx --x-position of point b
% by --x-position of point b
%
% Get input data.
disp('Calculate the distance between two points:');
ax = input ('Enter x value of point a:');
ay = input ('Enter y value of point a:');
bx = input ('Enter x value of point b:');
by = input ('Enter y value of point b:');
% Evaluate function
result = dist2 (ax, ay, bx, by);
% Write out result.
fprintf('The distance between points a and b is %f \n', result);
当脚本文件被执行时,它的结果显示如下:
>> test_dist2
Calculate the distance between two points:
Enter x value of point a:1
Enter y value of point a:1
Enter x value of point b:4
Enter y value of point b:5
The distance between points a and b is 5.000000
通过手动运算我们可知程序运算的结果是正确的。
函数 dist2 也支持 MATLAB 帮助子系统。如果你键入“help dist2”,将会得到的结果是:
>> help dist2
DIST2 Calculate the distance between two point
Function DIST2 calculates the distance between
two points (x1, y1) and (x2,y2) in a cartesian
coordinate system.
3
![](https://csdnimg.cn/release/download_crawler_static/85391981/bg5.jpg)
Calling sequence:
res = dist2(x1, y1, x2, y2)
Define variables:
x1 --x-position of point 1
y1 --y-position of point 1
x2 --x-position of point 2
y2 --y-position of point 2
distance --Distance between points
Record of revisions:
Date Pragrammer Description of change
======== ========== ================
12/15/98 S.J.Chapman Original code
Calculate distance.
相似地,键入“lookfor dist2”后将会产生如下的结果:
>> lookfor dist2
DIST2 Calculate the distance between two point
test_dist2.m: % Script file: test_dist2.m
>> lookfor distance
DIST2 Calculate the distance between two point
为了仔细观察工作区在函数执行前后的变化,我们将在 MATLAB 调试器中加载函数
dist2 和脚本文件 test_dist2。在函数加载前,加载中,加载后设置断点(如图 5.1 所示)。
当程序中止在函数调用之前的断点,它的工作区如图 5.2(a)所示。注意工作区中只有变
量 ax,ay,bx 和 by。当程序中止在函数调用过程中的断点,它的工作区如图 5.2(b)所示。
注意工作区中只有变量 x1,x2,y1,y2 和 distance。当程序中止在函数调用后的断点,它
的工作区如图 5.2(c)所示。注意工作区中原来的变量又重复出现,再加上函数返回的变量
result。这些图显示了 MATLAB 调用 M 文件的过程中工作区的变化。
4
剩余39页未读,继续阅读
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
matlab大师
- 粉丝: 2533
- 资源: 8万+
![benefits](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-1.c8e153b4.png)
下载权益
![privilege](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-2.ec46750a.png)
C知道特权
![article](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-3.fc5e5fb6.png)
VIP文章
![course-privilege](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-4.320a6894.png)
课程特权
![rights](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-icon.fe0226a8.png)
开通VIP
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)
评论0