M文件中 国 民 航 大 学 电 子 信 息 工 程 学 院本讲提纲
M文件概述
脚本文件
程序设计控制流
函数文件
局部变量和全局变量
Matlab的搜索过程
变量的检测传递和限权使用函数
串演算函数中 国 民 航 大 学 电 子 信 息 工 程 学 院
M文件概述
用 MATLAB语言编写的程序,称为 M文件。
M文件有两类:脚本文件和函数文件。
脚本文件:没有输入参数,也不返回输出参数。
函数文件:可以输入参数,也可返回输出参数。
中 国 民 航 大 学 电 子 信 息 工 程 学 院
M文件概述
M文件的建立与编辑
M文件的创建从 MATLAB命令窗口的 File菜单中选择 New菜单项,
再选择 M-file命令
edit 快捷图标
M文件的打开从 MATLAB命令窗口的 Flie菜单中选择 Open M-file命令。
edit filename 快捷图标
M文件的保存从 MATLAB命令窗口的 Flie菜单中选择 save 命令。
快捷图标中 国 民 航 大 学 电 子 信 息 工 程 学 院
M文件概述
M文件的一般结构函数申明行 function sa=circle(r,s)
H1 行 %CIRCLE plot a circle of radi r in the line specified
by s
在线帮助文本区 % r 指定半径的数值
% s 指定线色的字符串
% sa 圆面积
% sa=circle(r ) 计算圆面积并画半径为 r蓝色圆编写和修改纪录 % 编写于 2004年 11月 9日,修改与 2004年 11月 12日函数体 由实现该 M函数文件功能的 matlab指令组成接收输入量进行程序流控制得到输出量
中 国 民 航 大 学 电 子 信 息 工 程 学 院脚本文件概述:没有输入参数,也没有输出参数一组按用户意图排列的指令的集合运行后,所产生的所有变量都驻留在工作空间中
脚本文件的运行将需要运行的命令编辑到一个脚本文件中,然后在
MATLAB命令窗口输入该脚本文件的名字,就会顺序执行脚本文件中的命令。
运行 run命令中 国 民 航 大 学 电 子 信 息 工 程 学 院脚本文件
【 例 】 建立一个脚本文件将变量 a,b的值互换。
e31,m文件:
a=1:9;
b=[11,12,13;14,15,16;17,18,19];
c=a;a=b;b=c;
a
b
在 MATLAB的命令窗口中输入 e31,将会执行该脚本文件。
中 国 民 航 大 学 电 子 信 息 工 程 学 院脚本文件
数据的输入和输出
1,input函数,用于向计算机输入一个参数。
调用格式,A=input(‘message’)
A=input(‘message’,‘ s’);
注:第一种格式用于键入数值、字符串、元胞数组等数据第二种格式,不管键入什么,总以字符串形式付给变量 A,一般用于输入字符串时所选用 。
xm=input('What''s your name:','s')
中 国 民 航 大 学 电 子 信 息 工 程 学 院脚本文件例 求一元二次方程 a2 +bx+c=0的根。
a=input('a=');b=input('b=');
c=input('c=');d=b*b-4*a*c;
x=[(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)]
将该程序以 aa.m文件存盘,然后运行 aa.m
文件 。
中 国 民 航 大 学 电 子 信 息 工 程 学 院脚本文件
2,pause函数,暂停程序的执行。
调用格式,pause(延迟秒数 )
注:如果省略延迟时间,直接使用 pause,则将暂停程序,
直到用户按任一键后程序继续执行。
3,disp函数,命令窗口输出函数 。
调用格式,disp(输出项 )
注:输出项为字符串或矩阵 。
例如
A='Hello,MATLAB';
disp(A)
输出为,Hello,MATLAB
中 国 民 航 大 学 电 子 信 息 工 程 学 院
选择结构选择结构的语句有 if语句和 switch语句。
1,if语句格式一,if 条件语句组
end
程序设计控制流格式二,if 条件语句组 1
else
语句组 2
end
中 国 民 航 大 学 电 子 信 息 工 程 学 院格式三,if 条件 1
语句组 1
elseif 条件 2
语句组 2
……
elseif 条件 m
语句组 m
else
语句组 m+1
end
程序设计控制流中 国 民 航 大 学 电 子 信 息 工 程 学 院例 输入三角形的三条边,求面积。
A=input('请输入三角形的三条边,');
if A(1)+A(2)>A(3) & A(1)+A(3)>A(2) & A(2)+A(3)>A(1)
p=(A(1)+A(2)+A(3))/2;
s=sqrt(p*(p-A(1))*(p-A(2))*(p-A(3)));
disp(s);
else
disp('不能构成一个三角形 。 ')
end
运行,请输入三角形的三条边,[4 5 6]
9.9216
程序设计控制流中 国 民 航 大 学 电 子 信 息 工 程 学 院例 输入一个字符,若为大写字母,则输出其后继字符,
若为小写字母,则输出其前导字符,若为其他字符则原样输出 。
c=input('','s');
if c>='A' & c<='Z'
disp(char(abs(c)+1));
elseif c>='a'& c<='z'
disp(char(abs(c)-1));
else
disp(c);
end
程序设计控制流中 国 民 航 大 学 电 子 信 息 工 程 学 院
2 switch语句
switch语句根据变量或表达式的取值不同,分别执行不同的语句 。 其格式为:
switch 表达式
case 值 1
语句组 1
case 值 2
语句组 2
……
case 值 m
语句组 m
otherwise
语句组 m+1
end
程序设计控制流中 国 民 航 大 学 电 子 信 息 工 程 学 院例 根据变量 num 的值来决定显示的内容。
num=input('请输入一个数 ');
switch num
case -1
disp('I am a teacher.');
case 0
disp('I am a student.');
case 1
disp('You are a teacher.');
otherwise
disp('You are a student.');
end
程序设计控制流中 国 民 航 大 学 电 子 信 息 工 程 学 院
循环结构实现循环结构的语句,for语句和 while语句。
1,for语句:
格式,for 循环变量 =表达式 1:表达式 2:表达式 3
循环体语句
end
注:其中表达式 1的值为循环变量的初值,表达式 2的值为步长,表达式 3的值为循环变量的终值 。 步长为 1时,
表达式 2可以省略 。
程序设计控制流中 国 民 航 大 学 电 子 信 息 工 程 学 院例求 1到 100的和
sum=0
for i=1:100
sum=sum+i;
end
sum
2,while语句格式为:
while (条件 )
循环体语句
end
程序设计控制流中 国 民 航 大 学 电 子 信 息 工 程 学 院例,fibonacci 数组的元素满足 fibonacci规则:
a(k+2)=a(k)+a(k+1);a(1)=a(2),求该数组中第一个大于 10000的元素
a(1)=1;a(2)=1;
i=2;
while a(i)<=10000
a(i+1)=a(i)+a(i-1);
i=i+1;
end
disp(a(i))
程序设计控制流中 国 民 航 大 学 电 子 信 息 工 程 学 院
3,循环的嵌套
如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。
多重循环的嵌套层数可以是任意的 。 可以按照嵌套层数,分别叫做二重循环,三重循环等 。 处于内部的循环叫作内循环,
处于外部的循环叫作外循环 。
程序设计控制流中 国 民 航 大 学 电 子 信 息 工 程 学 院函数文件是另一种形式的 M文件,每一个函数文件都定义一个函数。事实上,
MATLAB提供的标准函数大部分都是由函数文件定义的。
函数文件中 国 民 航 大 学 电 子 信 息 工 程 学 院
函数文件格式:
函数文件由 function语句引导,其格式为:
function 输出形参表 =函数名 (输入形参表 )
注释说明部分函数体注:其中函数名的命名规则与变量名相同 。 输入形参为函数的输入参数,输出形参为函数的输出参数 。 当输出形参多于 1个时,则应该用方括号括起来 。
函数文件中 国 民 航 大 学 电 子 信 息 工 程 学 院
【 例 】 编写函数文件求小于任意自然数 n的
Fibonacci数列各项。
function f=ffib(n)
%用于求 Fibonacci数列的函数文件
%f=ffib(n)
%1999年 9月 30日编
f=[1,1];
i=1;
while f(i)+f(i+1)<n
f(i+2)=f(i)+f(i+1);
i=i+1;
end
将以上函数文件以文件名 ffib.m存盘,
然后在 MATLAB命令窗口输入以下命令,可求小于 2 000
的 Fibonacci数 。
ffib(2000)
函数文件中 国 民 航 大 学 电 子 信 息 工 程 学 院
函数调用函数文件编制好后,就可调用函数进行计算了 。
如上面定义 ffib函数后,调用它求小于 2000的
Fibonacci数 。
函数调用的一般格式是:
[输出实参表 ]=函数名 (输入实参表 )
函数文件中 国 民 航 大 学 电 子 信 息 工 程 学 院
【 例 】 利用函数文件,实现直角坐标 (x,y)与极坐标 (γ,θ)之间的转换。
函数文件 tran.m:
function [gama,theta]=tran(x,y)
gama=sqrt(x*x+y*y);
theta=atan(y/x);
调用 tran.m的脚本文件 main1.m:
x=input('Please input x=:');
y=input('Please input y=:');
[gam,the]=tran(x,y);
gam
the
函数文件中 国 民 航 大 学 电 子 信 息 工 程 学 院局部变量和全局变量
局部变量函数空间内部的中间变量仅限于函数本身
全局变量
global 指令定义全局变量的作用域是整个 MATLAB工作空间,
即全程 有效所有的函数都可以对它进行存取和修改希望共享全局变量的函数和工作空间,必须逐个用 global 指令加以定义中 国 民 航 大 学 电 子 信 息 工 程 学 院局部变量和全局变量例,先建立函数文件 wadd.m,该函数将输入的参数加权相加。
function f=wadd(x,y)
%add two variable
global ALPHA BETA
f=ALPHA*x+BETA*y;
在命令窗口中输入:
global ALPHA BETA
ALPHA=1;
BETA=2;
s=wadd(1,2)
输出为:
s =
5
中 国 民 航 大 学 电 子 信 息 工 程 学 院
Matlab搜索过程
Matlab 搜索过程 以指令 cow为例
检查 cow是否为变量名,如果不是,执行下一步
检查 cow是不是内建函数( Built-in Function);
检查 cow是不是 cow所在的 M文件中的一个子函数;
检查 cow是不是 cow所在的 M文件中的一个私用函数
(先找 cow.p,在找 cow.m)
检查 cow是不是当前目录上的文件(先找 cow.p,
cow.m)
检查搜索路径上是否有 cow存在。(先找 cow.p,
cow.m)
中 国 民 航 大 学 电 子 信 息 工 程 学 院变量的检测传递和权限使用函数
输入输出宗量检测指令在调用函数时,MATLAB用两个永久变量 nargin和 nargout分别记录调用该函数时的输入实参和输出实参的个数 。 只要在函数文件中包含这两个变量,就可以准确地知道该函数文件被调用时的输入输出参数个数,从而决定函数如何进行处理 。
中 国 民 航 大 学 电 子 信 息 工 程 学 院变量的检测传递和权限使用函数
nargin 在函数体内,用于获取实际输入宗量数
nargin(‘fun’) 获取‘ fun’指定函数的标称输入宗量数
nargout在函数体内,用于获取实际输出宗量数
nargout(‘fun’) 获取‘ fun’指定函数的标称输出宗量数在函数体内使用 nargin,nargout的目的是与程序流控制指令配合,对于不同数目的输入输出宗量数,函数可完成不同的任务不能使用赋值指令中 国 民 航 大 学 电 子 信 息 工 程 学 院
【 例 】 nargin用法示例函数文件 examp.m:
function fout=charray(a,b,c)
if nargin==1
fout=a;
elseif nargin==2
fout=a+b;
elseif nargin==3
fout=(a*b*c)/2;
end
命令文件 mydemo.m:
x=[1:3];y=[1;2;3];
examp(x)
examp(x,y')
examp(x,y,3)
执行 mydemo.m后的输出是:
ans =
1 2 3
ans =
2 4 6
ans =
21
变量的检测传递和权限使用函数中 国 民 航 大 学 电 子 信 息 工 程 学 院变量的检测传递和权限使用函数
跨空间变量传递实现不同工作空间之间变量传递的两种渠道;
全局变量 函数的输入输出宗量跨空间计算串表达式的值
evalin(‘workspace’,’expression’) 跨空间计算串表达式的值
evalin (‘workspace’,’expression1’,’expression2’)
跨空间计算替代串表达式的值说明
workspace 可取两个值 base 和 caller
中 国 民 航 大 学 电 子 信 息 工 程 学 院变量的检测传递和权限使用函数
Base 表示计算 eval(‘expression’)时,将从基本工作空间获得变量值。
Caller表示计算 eval(‘expression’)时,将从主调函数工作空间获得变量值。主调函数相对被调函数而言的。
被调函数是指 evalin所在的函数先从所在函数空间获取变量值,用
eval(‘expression1’)
计算原串表达式;若计算失败,则再从
‘ workspace’
指定的工作空间获取变量,再通过
eval(‘expression2’)
计算替代串表达式中 国 民 航 大 学 电 子 信 息 工 程 学 院变量的检测传递和限权使用函数
跨空间赋值
assignin(‘workspace’,’VN’,x) 跨空间向 VN变量赋值说明,
把当前工作空间内变量 x的值赋给‘ workspace’
指向空间名的 VN变量中 国 民 航 大 学 电 子 信 息 工 程 学 院变量的检测传递和限权使用函数
主函数第一个出现的函数称为主函数
子函数和私用函数
子函数:
每个子函数的第一行是其自己的函数申明行在 M函数文件内,主函数的位置不可改变,但子函数的排列次序可以任意改变子函数只能被处在同一文件的主函数或其他子函数调用在 M函数文件中,任何指令通过“名字”对函数进行调用时,子函数的优先级仅次于内装函数同一文件的主函数,子函数的工作空间都是彼此独立的
help,lookfor等帮助指令都不能提供关于子函数的任何帮助信息中 国 民 航 大 学 电 子 信 息 工 程 学 院变量的检测传递和限权使用函数
私用函数:位于 private目录上的 M文件函数
私用函数的构造与普通 M函数完全相同
私用函数只能被 private目录的直接父目录上的 M函数文件所调用
M文件中,任何指令通过“名字”对函数进行调用时,
私用函数的优先级虽低于内装函数和子函数,但高于其他目录上的函数
Help lookfor等指令都不能提供关于私用函数的任何帮助信息中 国 民 航 大 学 电 子 信 息 工 程 学 院串演算函数
eval 对字符串表达式进行计算
y=eval(‘CEM’)
[y1,y2,…]=eval(‘CEM’)
说明:
CEM,必须是字符串,可以是 Matlab任何合法的指令、表达式、语句或 M文件名第二种格式的 CEM只能是 M函数文件名
t=pi;
eval('theta=t/2,y=sin(theta)')
中 国 民 航 大 学 电 子 信 息 工 程 学 院串演算函数例
CEM={'cos','sin','tan'};
for k=1:3
theta=pi*k/12;
y(1,k)=eval([CEM{k},'(',num2str(theta),')']);
end
中 国 民 航 大 学 电 子 信 息 工 程 学 院串演算函数
Feval
[y1,y2,…]=feval(FH,arg1,arg2,…)
执行函数句柄 FH指定的计算
[y1,y2,…]=feval(FN,arg1,arg2,…)
执行函数名字符串 FN指定的计算
[y1,y2,…]=feval(FIL,arg1,arg2,…)
执行内联函数 FIL指定的计算
feval与函数句柄配套使用 ; eval与字符串配套使用
A=randn(2,2)
D=feval(@eig,A)
中 国 民 航 大 学 电 子 信 息 工 程 学 院内联函数内联函数是 Matlab提供的一个对象
inline(‘CE’,arg1,arg2,…) 把串表达式转化为 arg1,arg2
等指定输入宗量的内联函数。
inline(‘CE’,n) 把串表达式转化为 x,P1,P2,…,Pn 等指定输入宗量的内联函数。
说明:
CE是字符串,不包含等式
第一种调用格式是创建内联函数的最稳妥,可靠途径
第二种调用格式最简练。
中 国 民 航 大 学 电 子 信 息 工 程 学 院串演算函数沟通 eval,feval两个不同指令的‘桥梁’。凡 eval可以运作的表达式,都可以通过 inline转化为内联函数,而这种函数总可以被 feval使用。
内联函数的性质
class(inline_fun) 给出内联函数类型
char( inline_fun)给出内联函数计算公式
argnames(inline_fun) 给出内联函数的输入宗量
vectorize( inline_fun)使内联函数适用“数组运算”规则