程序设计基础
M文件简介
对于常用或者一些代码规模较大的的程序,如果每次都直接在命令窗口从头输入就显得不方便,容易出现错误且不便修改。为了解决这个问题,可以先将这些程序或者矩阵写入一个M文件,然后再MATLAB的命令窗口或程序中直接调用自定义的命令或函数,从而使得编程的效率大大提高.
M文件创建
例:编写一个输入边长,计算正方体的表面积和体积的M文件。
启动有关编辑程序或Matlab文本编辑器,文本前两行是文件头,一般说明文件的类型(M-file),文件名(square),和文件的功能(输入边长,计算正方体表面积和体积)。把输入的内容保存到工作空间,将文件名设为square.m。
% M-file, square.m
% 输入边长,求正方体表面积和体积
% 从键盘输入Type radius的值,并将它赋值给d.
d = input('Type side:');
area = 6 * d^2;
volume = d ^ 3;
fprintf('The side is %12.5f\n',d)
fprintf('The area of a square is %12.5f\n',area)
fprintf('The volume of a square is %12.5f\n',volume)
M文件调用
在完成上述两个M文件的创建之后该如何调用?
例:在MATLAB命令窗口输入square,即运行该M文件,就会运行提示输入边长完成表面积和体积的运算
MATLAB程序设计基础
顺序结构
顺序结构是指按照程序中语句的排列顺序依次执行,直到程序的最后一个语句.
1、数据的输入
从键盘输入数据,则可以使用input函数来进行,
调用格式为: A = input(提示信息,选项);
其中提示信息为一个字符串,用于提示用户输入数据。
例如:从键盘输入A矩阵,可以采用下面的命令来完成
A = input('输入A矩阵');
如果在input函数调用时采用’s’选项,则允许用户输入一个字符串。
例:xm = input('What’’s your name?','s')
•2、数据的输出
• 命令窗口输出函数主要有disp函数,其调用格式为:
• disp(输出项)
• 其中输出项既可以为字符串,也可以为矩阵。例如:
• A = 'Hello, Tom';
• disp(A) 输出为:Hello, Tom
• 又如:A = [1,2,3;4,5,6;7,8,9];
• disp(A)
• 输出为:
• 1 2 3
• 4 5 6
• 7 8 9
%disp函数输出格式更紧凑
例4.2 求一元二次方程 的根。
由于Matlab能进行复数运算,所以不需要判断方程的判别式,
可直接根据求根公式求根。
程序如下:
a = input('a=?');
b = input('b=?');
c = input('c=?');
pause
d = b*b-4*a*c;
x =[(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)];
disp(['x1=',num2str(x(1)),',x2=',num2str(x(2))]);
程序输出为:
a=?4
b=?78
c=?54
x1=-0.7188,x2=-18.7812
选择结构
选择结构是根据给定的条件成立或不成立,分别执行不同的语句。
Matlab用于实现选择结构的语句有if语句,switch语句和try语句。
1. if语句
在Matlab中,if语句有3种格式。
(1)单分支if语句
语句格式:
if 条件
语句组
end
(2)双分支if语句
语句格式:
if 条件
语句组 1
else
语句组 2
end
当条件成立时,执行语句组1,否则执行语句组2,然后再执行if语句的后续语句。
例4.3 计算分段函数:
程序如下:
x = input('请输入x的值:');
if x == 10
y =cos(x+1)+sqrt(x*x+1);
else
y =x*sqrt(x+sqrt(x));
end
y
也可以用单分支if语句来实现:
x = input('请输入x的值: ');
y = cos(x+1)+sqrt(x*x+1);
if x~=10
y =x*sqrt(x+sqrt(x));
end
y
(3)多分支if语句
语句格式:
if 条件1
语句组 1
elseif 条件2
语句组 2
…
elseif 条件m
语句组 m
else
语句组n
end
输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应的数值,若为其他字符则原样输出。
程序如下:
c = input('请输入一个字符','s');
if c >='A'& c<='Z'
disp(setstr(abs(c) + abs('a')-abs('A')));
elseif c>='a'& c<='z'
disp(setstr(abs(c)- abs('a') + abs('A')));
elseif c>='0'& c<='9'
disp(abs(c)-abs('0'));
else
disp(c);
end
2、switch语句
switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式:
switch 表达式
case 表达式1
语句组1
case 表达式2
语句组2
…
case 表达式m
语句组m
otherwise
语句组 n
end
switch子句后面的表达式应为一个标量或一个字符串;case子句后面的表达式不仅可以为一个标量或一个字符串,还可以为一个元胞矩阵。
•某商场对顾客所购买的商品实行打折销售,标准如下:
•price<200 没有折扣
•200<=price<500 3%折扣
•500<=price<1000 5%折扣
•1000<=price<2500 8%折扣
•2500<=price<5000 10%折扣
•5000<=price 14%折扣
•输入所售商品的价格,求其实际销售价格。
price = input('请输入商品价格');
switch fix(price/100)
case{0,1} %价格小于200
rate = 0;
case{2,3,4}
rate =3/100; %价格大于等于200但小于500
casenum2cell(5:9)
rate =5/100; %价格大于等于500但小于1000
case num2cell(10:24)
rate =8/100; %价格大于等于1000但小于2500
case num2cell(25:49)
rate = 10/100; %价格大于等于2500但小于5000
otherwise
rate = 14/100; %价格大于等于5000
end
price =price*(1-rate) %输出商品实际销售价格 num2cell函数是将数值矩阵转化为单元矩阵。
* fix() 向0方向取整,round()四舍五入取整,floor()向下取整,ceil()向上取整。
循环结构
•循环是指按照给定的条件,重复执行指定的语句,Matlab提供了两种实现循环结构的语句:for语句和while语句。
•1、for语句
•for语句的格式为:
•for 循环变量 =表达式1:表达式2:表达式3
• 循环体语句
•end
•其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的
•值为循环变量的终值。步长为1时,表达式2可以省略。
已知, 当n=100时,求y的值。
程序如下:
y = 0;n = 100;
for i=1:n
y =y+1/i/i;
end
y
输出结果为:
y =
1.6350
2、while语句
while语句的一般格式为:
while条件
循环体语句
end
其执行过程为:
若条件成立,则执行循环体语句,执行后再判断条件是否成立,
如果不成立则跳出循环。
从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们的和。
sum = 0;
n = 0;
x = input('Enter anumber(end in 0):');
while(x~=0)
sum =sum+x;
n = n+1;
x =input('Enter anumber(end in 0):');
end
if(n>0)
sum
mean =sum/n
end
•3、break语句和continur语句
•它们一般与if语句配合使用。
•break语句用于终止循环的执行。
•当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。
•continue语句控制跳过循环体中的某些语句。
•当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。
例4.9 求[100,200]之间第一个能被21整除的整数。
n程序如下:
for n = 100:200
ifrem(n,21)~=0;
continue
end
break
end
n
程序输出结果为:
n =
105
* 取模mod与取余rem
函数文件
• 函数文件是另一种形式的M文件,每一个函数文件都定义一个函数。Matlab提供的标准函数大部分是由函数文件定义的。
•4.3.1 函数文件的基本结构
• 函数文件由function语句引导,其基本结构为:
• function 输出形参表 = 函数名(输入形参表)
• 注释说明部分
• 函数体语句
• 其中,以function开头的一行为引导行,表示该M文件是一个函数文件。当输出形参多于一个时,应该用方括号括起来。
•1. 关于函数文件名
• 函数文件名通常由函数名再加上扩展名.m组成。
• 当函数文件名与函数名不同时,Matlab将忽略函数名而确认文件名,因此调用时使用函数文件名。
•2. 关于注释说明部分
• 注释说明包括3部分:
• ①紧随引导行之后以%开头的第一注释行。
• 这一行一般包括大写的函数文件名和函数功能简要描述,供lookfor关键词查询和help在线帮助时使用。
• ②第一注释行及之后连续的注释行。
• 通常包括函数输入/输出参数的含义及调用格式说明等信息,构成全部在线帮助文本。
③ 与在线帮助文本相隔一空行的注释行。
包括函数文件编写和修改的信息,如作者和版本等。
3、关于return语句
如果在函数文件中插入了return语句,则执行到该语句就结束函数
的执行,流程转至调用该函数的位置。通常也不使用return语句。
例5.10 编写函数文件,求半径为r的圆的面积和周长。
函数文件如下:
function [s,p] = fcircle(r)
% FCIRCLE calculate thearea and perimeter of a circle of radii r
%r 圆半径
%s 圆面积
%p 圆周长
%2006年2月30日编
s = pi*r*r;
p= 2*pi*r;
•将以上函数文件以文件名fcircle.m保存,然后在命令窗口调用。
•[s,p] = fcircle(10)
•输出结果是:
• s =
• 314.1593
• p =
• 62.8319
•采用help命令或lookfor命令可以显示出注释说明部分的内容。
• help fcircle
•屏幕显示
• FCIRCLE calculate the areaand perimeter of a circle of radii r
• r 圆半径
• s 圆面积
• p 圆周长
•
函数调用的一般格式是:
[输出实参表] = 函数名(输入实参表)
注意:函数调用时,各实参出现的顺序、个数,应与函数定义时相同。
例4.11
利用函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。
函数文件:tran.m:
function [rho,theta] = tran(x,y)
rho = sqrt(x*x+y*y);
theta = atan(y/x);
调用tran.m的命令文件main1.m:
x = input(‘pleaseinput x=:’);
y = input(‘please inputy=:’);
[rho,the] =tran(x,y);
rho
the
函数的嵌套调用
在Matlab中,函数可以嵌套调用,即一个函数可以调用别的函数。一个函数调用自身称为函数的递归调用。
例4.12 利用函数的递归调用,求n!。
n!本身就是以递归的形式定义的:
显然,求n!需要求(n-1)!,这时可采用递归调用。
函数如下:
function f = factor(n)
if n<=1
f= 1;
else
f= factor(n-1)*n; %递归调用求(n-1)!
end
•在命令文件中调用该函数文件,求 s = 1!+2!+3!+4!+5!。
• s = 0;
• for i = 1:5
• s = s + factor(i);
• end
• s
• 在命令窗口运行命令文件,结果如下:
• s =
• 153
全局变量与局部变量
Matlab中,函数文件中的变量是局部变量。
如若干函数中,都把某一变量定义为全局变量,那么这些函数将共用这个变量。
全局变量的作用域是整个Matlab的工作空间,所有函数都可以对它
进行存取和修改。
全局变量用global命令定义,格式为:
global 变量名
例4.13 全局变量应用示例。
先建立函数文件wadd.m,该函数将输入的参数加权相加:
function f =wadd(x,y) BETA = 2;
global ALPHABETA s = wadd(1,2)
f = ALPHA*x +BETA*y; 输出为:
在命令窗口中输入: s =
global ALPHA BETA 5
ALPHA = 1;