实验三 M 文件及 MATLAB 程序设计与调试
一、实验目的
全面掌握在 MATLAB 下进行程序设计的有关问题,具体涉及到 M 脚本文件和 M 函数文件的编写、全局和局部变量的使用、流程控制结构、提高程序执行效率的设计技术、程序调试等问题。
二、实验内容
1、关于 M 脚本文件和 M 函数文件
MATLAB 的 M 文件有两类:脚本文件和函数文件。
(1)脚本文件——将原本要在 MATLAB 的指令窗口中直接输入的语句,放在一个以.m 为后缀的,称为脚本文件中。有了脚本文件,可直接在 MATLAB 中输入脚本文件名(不含后缀)。MATLAB 会打开这一脚本文件,并依次执行脚本文件中的每一条语句,这与在 MATLAB 中直接输入语句的结果完全一致。
(2)函数文件——它的第一行必须是函数定义行。
M 函数文件由 5 部分构成:
◆ 函数定义行
◆ H1 行
◆ 函数帮助文本
◆ 函数体
◆ 注释
注意:在函数文件中,除了函数定义行之外,其它部分都是可以省略的。但作为一个函数,为了提高函数的可用性,应加上 H1 行和函数帮助文本,为了提高函数的可读性,应加上适当的注释。
例如:
function y = mean(x)
% MEAN Average or mean value.
% For vectors, MEAN(X) is the mean value of the elements in X.
% For matrices, MEAN(X) is a row vector containing the mean value of each column.
[m,n]=size(x);
if m==1
% Determine whether x is a vector
m=n;
end
y = sum(x)/m;
函数定义行:function y = mean(x)
function 为函数定义的关键字,mean 为函数名,y 为输出变量,x 为输入变量当函数具有多个输出变量时,则以方括号括起;当函数具有多个输入变量时,则直接用圆括号括起。
例如: function [x,y,z]=sphere(theta, phi, rho)。
当函数不含输出变量时,则直接略去输出部分或采用空方括号表示,
例如:function printresults(x) 或function [ ]=printresults(x)
所有在函数中使用和生成的变量都为局部变量(除非利用 global 语句定义),这些变量值只能通过输入和输出变量进行传递。因此,在调用函数时应通过输入变量将参数传递给函数;函数调用返回时也应通过输出变量将运算结果传递给函数调用者;其它在函数中产生的变量在返回时被全部清除。
H1 行:描述了函数的“功能”信息(很重要!)
函数文件中第二行一般是注释行,这一行称为 H1 行,实际上它是帮助文本中的第一行。H1 行不仅可以由 help funtion-name 命令显示,而且,lookfor 命令只在 H1 行内搜索,
函数帮助文本:用来比较详细地说明这一函数的用法
以%开头,输入时 help funtion-name 命令,可显示出 H1 行和函数帮助文本。
函数体:完成指定功能的语句实体
可采用任何可用的 MATLAB 命令,包括 MATLAB 提供的函数和用户自己设计的 M 函数。
注释
● 备注:
⏹ 函数定义名和保存文件名必须一致。两者不一致时,MATLAB 将忽视文件首行的函数定义名,而以保存文件名为准;
⏹ 函数文件的名字必须以字母开头,后面可以是字母、下划线以及数字的任意组合,但不得超过 63 个字符;
⏹ 建议在编写 H1 行时,采用英文表达。这样处理是为了以后关键词检索方便。
(3)脚本文件和函数文件比较
比较项 | 脚本文件 | 函数文件 |
定义行 | 无需定义行 | 必须有定义行 |
输入/输出变量 | 无 | 有 |
数据传送 | 直接访问基本工作空间中的所有变量 | 通过输入变量获得输入数据;通过输出变量提交结果 |
编程方法 | 直接选取 MATLAB 中执行的语句 | 精心设计完成指定功能 |
用途 | 重复操作 | MATLAB 功能扩展 |
函数文件去掉其第一行的定义行,就转变成了脚本文件。但这样一来使用的局部变量就成了基本工作空间中的变量,这会带来几个问题:
● 基本工作空间中与脚本文件中同名的变量会引起冲突
● 使基本工作空间中变量数急剧增加,造成内存紧张
● 编程时要细心考虑各个脚本文件所用到的变量
这些问题在函数文件中不复存在,MATLAB 通过实参与形参一一对应的方式来实现函数的调用,这极大地方便了程序设计。
举例:分别编写出求取平均值与标准差的脚本文件 stat1.m 和函数文件 stat 2.m。
stat1.m %脚本文件
%求阵列 x 的平均值和标准差
[m,n]=size(x);
if m==1
m=n;
end
s1=sum(x);
s2=sum(x.^2);
mean1=s1/m;
stdev=sqrt(s2/m-mean1 ^2);
stat2.m %函数文件
function [mean1,stdev]=stat2(x)
%STAT2函数文件
%求阵列 x 的平均值和标准差
[m,n]=size(x);
if m==1
m=n;
end
s1=sum(x);
s2=sum(x.^2);
mean1=s1/m;
stdev=sqrt(s2/m-mean1 ^2);
在命令窗口依次输入如下命令:
clear
x=rand(4,4)+2;
stat1 %执行 stat1.m 后,观察基本空间中的变量情况。
whos %可见:脚本文件所产生的所有变量都返回了工作空间
Name Size Bytes Class
m 1x1 8 double array
mean1 1x4 32 double array
n 1x1 8 double array
s1 1x4 32 double array
s2 1x4 32 double array
stdev 1x4 32 double array
x 4x4 128 double array
Grand total is 34 elements using 272 bytes
disp([mean1;stdev]) %观察计算结果
2.7891 2.3084 2.2860 2.3083
0.2192 0.3196 0.1852 0.2699
在命令窗口顺序输入如下命令:
clear m n s1 s2 mean1 stdev
[m1,std1]=stat2(x); %执行 stat2.m 后,观察基本基本空间中的变量情况
whos %只增加了由函数返回的结果
Name Size Bytes Class
m1 1x4 32 double array
std1 1x4 32 double array
x 4x4 128 double array
switch函数用法举例Grand total is 24 elements using 192 bytes
disp([m1;std1]) %观察计算结果,和 stat1.m 一致
2.7891 2.3084 2.2860 2.3083
0.2192 0.3196 0.1852 0.2699
★ 备注:
1)运行脚本文件,产生的所有变量都驻留在 MATLAB 基本工作空间(Base workspace),只要不使用 clear 且不关闭指令窗口,这些变量将一直保存着。(基本工作空间随 MATLAB的启动而产生,只有关闭 MATLAB 时,该基本空间才被删除。)
2) 运行函数文件,MATLAB 就会专门开辟一个临时工作空间,称为函数工作空间(Function workspace),所有中间变量都存放在函数工作空间中,当执行完最后一条指令或遇到 return 时,就结束该函数文件的运行,同时该临时函数工作空间及其所有中间变量就立即被清除。(函数工作空间随具体M 函数文件的被调用而产生,随调用结束而删除。函数工作空间是相对基本工作空间对立的、临时的。在 MATLAB 这个运行期间,可以产生任意多个临时函数工作空间,而基本工作空间。)
3)如果在函数文件中,调用了某脚本文件,那么该脚本文件运行所产生的所有变量都
放在该函数工作空间中,而不是放在基本工作空间中。
2、函数的变量:局部变量和全局变量,输入变量和输出变量
(1)局部变量(Local variable):函数工作空间内部的中间变量,产生于函数的运行过程中,其影响范围仅限于该函数本身。
(2)全局变量(Global variabl):被不同函数工作空间和基本工作空间共享的变量希望共享全局变量的函数空间或基本空间必须逐个用 global 对具体变量加以专门定义。如果某函数的运行使全局变量的内容发生变化,那么其他空间中的同名变量也随之变化,除非与全局变量联系的所有工作空间都被删除,否则全局变量依然存在。
● 备注:
⏹ 对全局变量的定义必须在被使用之前,建议把对全局变量的定义放在函数体的首行位置
⏹ 为了提高 M 文件的可读性,建议选用大写字符命名全局变量
⏹ 实际编程中,并不提倡使用全局变量 (因它损害了函数的封装性)
(3)输入和输出变量数:nargin、nargout(可获取函数实际输入/输出变量数)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论