第4章 matlab在编程方面的应用.docx
《第4章 matlab在编程方面的应用.docx》由会员分享,可在线阅读,更多相关《第4章 matlab在编程方面的应用.docx(15页珍藏版)》请在冰豆网上搜索。
第4章matlab在编程方面的应用
.matlab在编程方面的应用
本章主要对matlab在编程方面的应用作一个较详细的介绍,其中涉及了编程必然须注意的变量类型、数据类型、程序控制语句及matlab函数等相关内容。
一、变量、语句
1变量命名规则
Ø必须以字母开头;
Ø可以由字母、数字和下划线混合组成;
Ø字符长度应不大于31个。
注意:
matlab区分大小写。
2局部变量和全局变量
通常,每个函数体内都有自己定义的变量,不能从其他函数和MATLAB工作空间访问这些变量,这些变量即是局部变量。
如果要使某个变量在几个函数中和MATLAB函数空间都能使用,可以把它定义为全局变量。
全局变量就是用关键字“global”声明的变量。
全局变量名尽量大写,并能够反映它本身的含义。
如果需要在几个函数中和MATLAB工作空间都能访问一个全局变量,那么必须在每个函数中和MATLAB工作空间内都声明该变量为全局变量为全局的。
全局变量需要在函数体的变量赋值语句之前说明,整个函数以及所有对函数的递归调用都可以利用全局变量。
注意:
实际编程中,应尽量避免使用全局变量,因为全局变量的值一旦在一个地方被改变,那么在其他包括该变量的函数中都将改变,这样由可能会出现不可遇见的情况。
如果需要用全局变量,建议全局变量名要长,能反映它本身的含义,并且最好所有字母都大写,并由选择地以首次出现的M文件的名字开头。
3基本语句
MATLAB可以认为是一种解释性语言,用户可以在MATLAB命令窗口键入命令,也可以在编辑器内编写应用程序,这样MATLAB软件对此命令或程序中各条语句进行翻译,然后在MATLAB环境下对它进行处理,最后返回运算结果。
MATLAB语言的基本语句结构为:
变量名列表=表达式
其中等号左边的变量名列表为MATLAB语句的返回值,等号右边的是表达式的定义,它可以是MATLAB允许的矩阵运算,也可以是函数调用。
等号右边的表达式可以由分号结束,也可以由逗号或回车结束,但它们的含义是不同的,如果用分号结束,则左边的变量的结果将不在屏幕上显示,否则将把结果全部显示出来。
MATLAB语言和C语言不同,在调用函数时MATLAB允许一次返回多个结果,这时等号左边是[]括起来的变量列表。
注意:
表达式中的运算符号两侧允许有空格,以增加可读性。
但在复数或符号表达式中要尽量避免,以防出错。
在MATLAB的基本语句结构中,等号左边的变量名列表和等号一起可以省略,这时将把表达式的执行结果自动赋给变量“ans”,并显示到命令窗口中。
4数据类型
MATLAB下的数据类型最大的特点就是每一种数据类型都是以数组为基础,都是从数组派生出来的,MATLAB事实上把每种类型的数据都作为数组处理。
MATLAB下有六种基本数据类型,分别是:
double(双精度数值),char(字符),sparse(稀疏数据),storage(存储型),cell(单元数组),struct(结构)。
其中存储类型是一个虚拟数据类型,这是MATLAB后来几个版本新增的定义,它包括:
int8(8位整型),uint8(无符号8位整型),int16(16位整型),uint16(无符号16位整型),int32(32位整型),uint32(无符号32位整型)。
MATLAB有两种工作方式:
交互式的命令行工作方式
M文件的程序工作方式
一.M文件
用MATLAB语言编写的程序,称为M文件。
M文件有两类:
命令文件和函数文件。
命令文件:
没有输入参数,也不返回输出参数。
函数文件:
可以输入参数,也可返回输出参数。
1.M文件的建立与编辑
建立新的M文件:
从MATLAB命令窗口的File菜单中选择New菜单项,再选择M-file命令。
2.命令文件
将需要运行的命令编辑到一个命令文件中,然后在MATLAB命令窗口输入该命令文件的名字,就会顺序执行命令文件中的命令。
【例1】建立一个命令文件将变量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(提示信息,选项);
注:
‘s’选项,则允许用户输入一个字符串。
例如想输入一个人的姓名,可采用命令
xm=input('What''syourname:
','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
ifrand
(1)>0.5
disp('iloveyou')
end
格式二:
if条件
语句组1
else
语句组2
end
?
ifrand
(1)>0.5
disp('iloveyou')
else
disp('idonotloveyou')
end
(一)选择结构
格式三:
if条件1
语句组1
elseif条件2
语句组2
……
elseif条件m
语句组m
else
语句组m+1
end
【例4】输入三角形的三条边,求面积。
A=input('请输入三角形的三条边:
');
ifA
(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
运行:
请输入三角形的三条边:
[456]
9.9216
【例5】输入一个字符,若为大写字母,则输出其后继字符,若为小写字母,则输出其前导字符,若为其他字符则原样输出。
c=input('','s');
ifc>='A'&c<='Z'
disp(setstr(abs(c)+1));
elseifc>='a'&c<='z'
disp(setstr(abs(c)-1));
else
disp(c);
end
2switch语句
switch语句根据变量或表达式的取值不同,分别执行不同的语句。
其格式为:
switch表达式
case值1
语句组1
case值2
语句组2
……
case值m
语句组m
otherwise
语句组m+1
end
【例6】根据变量num的值来决定显示的内容。
num=input('请输入一个数');
switchnum
case-1
disp('Iamateacher.');
case0
disp('Iamastudent.');
case1
disp('Youareateacher.');
otherwise
disp('Youareastudent.');
end
(二)循环结构
实现循环结构的语句:
for语句和while语句。
1.for语句:
格式:
for循环变量=表达式1:
表达式2:
表达式3
循环体语句
end
注:
其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。
步长为1时,表达式2可以省略。
例:
n=0:
1:
10;
y=n;
fori=1:
11
y(i)=sin(n(i));
end
y
● 为了得到最大的速度,在For循环(While循环)被执行之前,应预先分配数组。
建议最好先使用zeros或ones等命令来预先配置所需的内存(即矩阵)大小
● 可以利用break命令跳出for循环
2.while语句
格式为:
while(条件)
循环体语句
end
>>x=zeros(1,6);%x是一个的零矩阵
i=1;
whilei<=6,
x(i)=1/i;
i=i+1;
end
>>x
【例7】根据例3.6中求y的表达式,求:
(1)y<3时的最大n值。
(2)与
(1)的n值对应的y值。
求y的表达式
y=0;i=1;
while1%循环的条件为1,即循环条件总是满足的,这是一个永真循环
f=1/(2*i-1);
y=y+f;
ify>3
break;
end
i=i+1;
end
n=i-1
y=y-f
3.循环的嵌套
如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。
多重循环的嵌套层数可以是任意的。
可以按照嵌套层数,分别叫做二重循环、三重循环等。
处于内部的循环叫作内循环,处于外部的循环叫作外循环。
【例8】求[100,1000]以内的全部素数。
n=0;
form=100:
1000
flag=1;j=m-1;
i=2;
whilei<=j&flag
ifrem(m,i)==0
flag=0;
end
i=i+1;
end
ifflag
n=n+1;
prime(n)=m;
end
end
prime%变量prime存放素数
四.函数文件
1.函数文件格式
函数文件是另一种形式的M文件,每一个函数文件都定义一个函数。
事实上,MATLAB提供的标准函数大部分都是由函数文件定义的。
【例9】编写函数文件求小于任意自然数n的Fibonacci数列各项。
functionf=ffib(n)
%用于求Fibonacci数列的函数文件
%f=ffib(n)
%1999年9月30日编
f=[1,1];
i=1;
whilef(i)+f(i+1)f(i+2)=f(i)+f(i+1);
i=i+1;
end
将以上函数文件以文件名ffib.m存盘,然后在MATLAB命令窗口输入以下命令,可求小于2000的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('Pleaseinputx=:
');
y=input('Pleaseinputy=:
');
[gam,the]=tran(x,y);
gam
the
【例11】利用函数的递归调用,求n!
。
functionf=factor(n)
ifn<=1
f=1;
else
f=factor(n-1)*n;
end
return;%返回
在命令文件main2.m中调用函数文件factor.m:
fori=1:
10
fac(i)=factor(i);
end
fac
程序运行结果是:
fac=
Columns1through612624120720Columns7through10
504403203628803628800
3.函数所传递参数的可调性
MATLAB在函数调用上有一个与众不同之处:
函数所传递参数数目的可调性。
凭借这一点,一个函数可完成多种功能。
在调用函数时,MATLAB用两个永久变量nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数。
只要在函数文件中包含这两个变量,就可以准确地知道该函数文件被调用时的输入输出参数个数,从而决定函数如何进行处理。
【例12】nargin用法示例
函数文件examp.m:
functionfout=charray(a,b,c)
ifnargin==1
fout=a;
elseifnargin==2
fout=a+b;
elseifnargin==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=
123
ans=
246
ans=
21
【例13】全局变量应用示例
在MATLAB中,全局变量用命令global定义。
函数文件的内部变量是局部的,与其他函数文件及MATLAB工作空间相互隔离。
但是,如果在若干函数中,都把某一变量定义为全局变量,那么这些函数将公用这一个变量。
全局变量的作用域是整个MATLAB工作空间,即全程有效。
所有的函数都可以对它进行存取和修改。
因此,定义全局变量是函数间传递信息的一种手段。
【例13】全局变量应用示例
先建立函数文件wadd.m,该函数将输入的参数加权相加。
functionf=wadd(x,y)
%addtwovariable
globalALPHABETA
f=ALPHA*x+BETA*y;
在命令窗口中输入:
globalALPHABETA
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];
fork=a
forj=1:
4
ifrem(k(j),2)~=0
s=s+k(j);
end
end
end
s