第二讲 MATLAB程序设计
MATLAB有两种工作方式:
交互式的命令行工作方式
M文件的程序工作方式
一, M文件
一, M文件
用 MATLAB语言编写的程序,称为 M文件。
M文件有两类:命令文件和函数文件。
命令文件:没有输入参数,也不返回输出
参数。
函数文件:可以输入参数,也可返回输出
参数。
1,M文件的建立与编辑
建立新的 M文件:
从 MATLAB命令窗口的 File菜单中选择 New菜
单项,再选择 M-file命令。
一, M文件
编辑已有的 M文件:
从 MATLAB命令窗口的 Flie菜单中选择 Open
M-file命令。
2.命令文件
将需要运行的命令编辑到一个命令文件中,然后在
MATLAB命令窗口输入该命令文件的名字,就会顺序执
行命令文件中的命令。
【 例 1】 建立一个命令文件将变量 a,b的值互
换。
一, M文件
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(提示信息, 选项 );
注:‘ s’选项,则允许用户输入一个字符串。
例如想输入一个人的姓名, 可采用命令
xm=input('What''s your name:','s')
【 例 2】 求一元二次方程 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
三.程序设计
【 例 4】 输入三角形的三条边,求面积。
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
三.程序设计
(一 )选择结构
【 例 5】 输入一个字符,若为大写字母,则输出其后继
字符,若为小写字母,则输出其前导字符,若为其他字
符则原样输出。
c=input('','s');
if c>='A' & c<='Z'
disp(setstr(abs(c)+1));
elseif c>='a'& c<='z'
disp(setstr(abs(c)-1));
else
disp(c);
end
三.程序设计
(一 )选择结构
2 switch语句
switch语句根据变量
或表达式的取值不同,
分别执行不同的语句 。
其格式为:
switch 表达式
case 值 1
语句组 1
case 值 2
语句组 2
……
case 值 m
语句组 m
otherwise
语句组 m+1
end
三.程序设计
(一 )选择结构
【 例 6】 根据变量 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可以省略 。
三.程序设计
2,while语句
格式为:
while (条件 )
循环体语句
end
【 例 7】 根据例 3.6中求 y的表达式, 求:
(1)y<3时的最大 n值 。
(2)与 (1)的 n值对应的 y值 。
三.程序设计
(二 )循环结构
求 y的表达式
y=0; i=1;
while 1 %循环的条件为 1,即循环条件总是满足的, 这是一个永真循环
f=1/(2*i-1);
y=y+f;
if y>3
break;
end
i=i+1;
end
n=i-1
y=y-f
三.程序设计
(二 )循环结构
3,循环的嵌套
如果一个循环结构的循环体又包括一个
循环结构,就称为循环的嵌套,或称为多
重循环结构。
多重循环的嵌套层数可以是任意的 。 可
以按照嵌套层数, 分别叫做二重循环, 三
重循环等 。 处于内部的循环叫作内循环,
处于外部的循环叫作外循环 。
三.程序设计
(二 )循环结构
【 例 8】 求 [100,1000]以内的全部素数。
n=0;
for m=100:1000
flag=1; j=m-1;
i=2;
while i<=j & flag
if rem(m,i)==0
flag=0;
end
i=i+1;
end
if flag
n=n+1;
prime(n)=m;
end
end
prime %变量 prime存放素数
三.程序设计
(二 )循环结构
四.函数文件
函数文件是另一种形式的 M文件,每一个函数文件都
定义一个函数。事实上,MATLAB提供的标准函数大部
分都是由函数文件定义的。
四, 函数文件
1.函数文件格式
函数文件由 function语句引导, 其格式为:
function 输出形参表 =函数名 (输入形参表 )
注释说明部分
函数体
注:其中函数名的命名规则与变量名相同 。 输入形参为
函数的输入参数, 输出形参为函数的输出参数 。 当输出
形参多于 1个时, 则应该用方括号括起来 。
【 例 9】 编写函数文件求小于任意自然数 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)
四, 函数文件
2.函数调用
函数文件编制好后, 就可调用函数进行计算了 。
如上面定义 ffib函数后, 调用它求小于 2000的
Fibonacci数 。
函数调用的一般格式是:
[输出实参表 ]=函数名 (输入实参表 )
四, 函数文件
【 例 10】 利用函数文件,实现直角坐标 (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
已知转换公式为:
极坐标的矢径:
γ=
极坐标的幅角:
θ=
四, 函数文件
【 例 11】 利用函数的递归调用,求 n!。
function f=factor(n)
if n<=1
f=1;
else
f=factor(n-1)*n;
end
return; %返回
在命令文件 main2.m中调用函数文件 factor.m:
for i=1:10
fac(i)=factor(i);
end
fac
程序运行结果是:
fac =
Columns 1 through 6
1 2 6
24 120 720
Columns 7 through 10
504 40320 362880
3628800
四, 函数文件
3,函数所传递参数的可调性
MATLAB在函数调用上有一个与众不同之处:
函数所传递参数数目的可调性 。 凭借这一点, 一
个函数可完成多种功能 。
在调用函数时, MATLAB用两个永久变量
nargin和 nargout分别记录调用该函数时的输入实
参和输出实参的个数 。 只要在函数文件中包含这
两个变量, 就可以准确地知道该函数文件被调用
时的输入输出参数个数, 从而决定函数如何进行
处理 。
四, 函数文件
【 例 12】 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
四, 函数文件
五.全局变量和局部变量
在 MATLAB中,全局变量用命令 global定义。函数文件
的内部变量是局部的,与其他函数文件及 MATLAB工作空间
相互隔离。但是,如果在若干函数中,都把某一变量定义为
全局变量,那么这些函数将公用这一个变量。全局变量的作
用域是整个 MATLAB工作空间,即全程有效。所有的函数都
可以对它进行存取和修改。因此,定义全局变量是函数间传
递信息的一种手段。
四, 函数文件
【 例 13】 全局变量应用示例
先建立函数文件 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
习 题
1,输入 20个数, 求其中最大数和最小数 。
要求分别用循环结构和调用 MATLAB的
max函数, min函数来实现 。
2,求 Fibonacci数列
(1)大于 4000的最小项 。
(2)5000之内的项数 。
3,写出下列程序的输出结果,
s=0;
a=[12,13,14;15,16,17;18,19,20;21,22,23];
for k=a
for j=1:4
if rem(k(j),2)~=0
s=s+k(j);
end
end
end
s