经典MATLAB循环语句.docx
《经典MATLAB循环语句.docx》由会员分享,可在线阅读,更多相关《经典MATLAB循环语句.docx(9页珍藏版)》请在冰豆网上搜索。
![经典MATLAB循环语句.docx](https://file1.bdocx.com/fileroot1/2023-1/30/d6d5cbf8-a33d-427e-adf4-384a3c4e521e/d6d5cbf8-a33d-427e-adf4-384a3c4e521e1.gif)
经典MATLAB循环语句
不用for,if,直接
length(find(diff(a)==1))
就可以了
如果非要用for,if
s=0;
forn=1:
length(a)-1,
ifa(n+1)-a(n)==1,
s=s+1;
end
end
s
matlab基本语句
1.循环语句for
for i=s1:
s3:
s2
循环语句组
end
解释:
首先给i赋值s1;然后,判断i是否介于s1与s2之间;如果是,则执行循环语句组,i=i+s3(否则,退出循环.);执行完毕后,继续下一次循环。
例:
求1到100的和,可以编程如下:
sum=0
for i=1:
1:
100
sum=sum+i
end
这个程序也可以用while语句编程。
注:
for循环可以通过break语句结束整个for循环.
2.循环语句while
例:
sum=0;i=1;
while(i<=100)
sum=sum+i;i=i+1;
end
3.if语句
if(条件)
语句
end
if(条件)
语句
else
语句
end
if(条件)
语句
elseif
语句
end
4.关系表达式:
=,>,<,>=,<=,==(精确等于)
5.逻辑表达式:
|(或),&(且)
6.[n,m]=size(A)(A为矩阵)
这样可以得到矩阵A的行和列数
n=length(A),可以得到向量A的分量个数;如果是矩阵,则得到矩阵A的行与列数这两个数字中的最大值。
7.!
后面接Dos命令可以调用运行一个dos程序。
8.常见函数:
poly():
为求矩阵的特征多项式的函数,得到的为特征多项式的各个系数。
如a=[1,0,0;0,2,0;0,0,3],则poly(a)=1 -6 11 -6。
相当于poly(a)=1入^3+(-6)入^2+11入+(-6)。
compan():
可以求矩阵的伴随矩阵.
sin()等三角函数。
MATLAB在数学建模中的应用(3)
一、程序设计概述
MATLAB所提供的程序设计语言是一种被称为第四代编程语言的高级程序设计语言,其程序简洁,可读性很强,容易调试。
同时,MATLAB的编程效率比C/C++语言要高得多。
MATLAB编程环境有很多。
常用的有:
1. 命令窗口
2. word窗口
3. M-文件编辑器,这是最好的编程环境。
M-文件的扩展名为“.m”。
M-文件的格式分为两种:
①M-脚本文件,也可称为“命令文件”。
② M-函数文件。
这是matlab程序设计的主流。
保存后的文件可以随时调用。
二、MATLAB程序结构
按照现代程序设计的观点,任何算法功能都可以通过三种基本程序结构来实现,这三种结构是:
顺序结构、选择结构和循环结构。
其中顺序结构是最基本的结构,它依照语句的自然顺序逐条地执行程序的各条语句。
如果要根据输入数据的实际情况进行逻辑判断,对不同的结果进行不同的处理,可以使用选择结构。
如果需要反复执行某些程序段落,可以使用循环结构。
1 顺序结构
顺序结构是由两个程序模块串接构成。
一个程序模块是完成一项独立功能的逻辑单元,它可以是一段程序、一个函数,或者是一条语句。
看图可知,在顺序结构中,这两个程序模块是顺序执行的,即先执行<程序模块1>,然后执行<程序模块2>。
实现顺序结构的方法非常简单,只需将程序语句顺序排列即可。
2 选择结构
在MATLAB中,选择结构可由两种语句来实现。
(1) if语句
if语句的最简单用法为:
if 表达式;
程序模块;
end
if语句的另一种用法为:
if 表达式
程序模块1
else
程序模块2
end
例1 使用if语句判断学生的成绩是否及格。
程序:
clear
n=input(’输入n= ’)
m=60;
if n<m,
r=’不及格’
else
r=’及格’
end
练习一:
将例1写入M-文件编辑器,然后在command window 调用这个程序。
当针对多个条件进行选择时,可以采用下面的格式:
if 表达式1
程序模块1
elseif 表达式2
程序模块2
…… ……
elseif 表达式n
程序模块n
else
程序模块n+1
end
例2 将百分之的学生成绩转换为五分制输出。
程序:
clear
n=input(’输入n= ’)
if n>=90
chji=’优秀’
elseif n>=80
chji=’良好’
elseif n>=70
chji=’中等’
elseif n>=60
chji=’及格’
else
chji=’不及格’
end
练习二:
将例2写入M-文件编辑器,然后在command window 调用这个程序。
(2) switch语句
switch语句可以替代多分支的if语句,而且switch语句简洁明了,可读性更好。
其格式为:
switch 表达式
case 数值1
程序模块1
case 数值2
程序模块2
……
otherwise
程序模块n
end
其中的otherwise模块可以省略。
switch语句的执行过程是:
首先计算表达式的值,然后将其结果与每一个case后面的数值依次进行比较,如果相等,则执行该case的程序模块;如果都不相等,则执行otherwise模块中的语句。
如图3所示。
例3 用switch…case开关结构将百分制的学生成绩转换为五分制的成绩输出。
程序:
clear
x=58
switch fix(x/10)
case {10,9}
y=’优秀’
case 8
y=’良好’
case 7
y=’中等’
case 6
y=’及格’
otherwise
y=’不及格’
end
练习三:
将例3写入M-文件编辑器,然后在command window 调用这个程序。
3 循环结构
循环结构的流程图如图4所示它可以多次重复执行某一组语句。
循环是计算机解决问题的主要手段。
在MATLAB中,循环结构可以由两种语句结构实现。
(1) for…end循环结构。
其格式为:
for i=V,循环体结构,end
其中V为一个行向量,循环变量i每次从V中取一个数值,执行一次循环体的内容,如此下去,直到完成V中的所有分量,就自动结束循环体的执行。
例4 计算 s=12+22+52。
程序:
a=[1 2 5 ]; s=0;
for k=a,
s=s+k^2;
end,
s,
该例题只是为了说明for语句的格式,事实上,用下面的语句求和更为简单。
命令:
p=sum(a.^2)
练习四:
建立MATLAB与word的连接,在新建的m-book中写入上面的程序,并用notebook菜单运行之。
循环结构里面还可以包含循环结构,形成多重循环。
例5 设计一个九九乘法表。
程序:
clear
for i=1:
9
for j=1:
9
a(i , j)=i*j;
end
end
a,
练习五:
①直接在命令窗编写上面的程序。
②试运行下面的程序,并加以分析:
程序:
disp(’ 九九乘法表 ’),for i=1:
9,
for j=1:
i,p{i}(j)=j*i;end,disp(p{i}),end
(2) while…end循环结构。
其格式为:
while (表达式)
循环结构体
end
例6 求MATLAB的相对精度
解:
解题的思路是,让y值不断减小,直到MATLAB分不出1+y与1的差别为止。
程序:
y=1; while 1+y>1; y1=y; y=y/2; end,y1
说明:
①for循环与while循环的区别是,for语句的循环次数是确定的,而while语句的循环次数是不确定的。
②一定要注意在循环结构体内设置“修改条件表达式的语句”,以免进入“死循环”。
③一旦出现死循环,在命令窗用ctrl+c可使程序中止。
④注意程序的可读性。
练习六:
在M-文件编辑器内编写上面的脚本文件,并利用菜单或快捷按钮运行之。
三、M-文件
M文件是包含MATLAB代码的文件。
M文件按其内容和功能可分为脚本M文件和函数M文件这两大类。
1、脚本M文件
脚本M文件是许多MATLAB代码按顺序组成的命令集合,不接受参数的输入和输出,与MATLAB工作区共享变量空间。
脚本文件一般用来实现一个相对独立的功能,比如对某个数据集进行某种分析、绘图,求解方程等等。
前面的几个例题都是脚本文件的类型。
2、函数M文件
MATLAB的M-函数是由function语句引导的,其基本格式如下:
function [输出形参列表] = 函数名 (输入形参列表)
注释说明语句段,由%引导;
函数体语句
函数文件需要在M-文件编辑器中编写。
写完以后,按照当前的搜索路径保存。
以后就可以随时调用这个函数了。
与脚本M文件不同的是,调用函数M文件时需要输入自变量的实际值。
随便打开一个M-文件看一看:
open lsqlin
编程实例
例7. 定义一个函数 f(x)=[sin(x)]2, 其中x以“度”为单位。
然后再调用该函数。
解:
在M-文件编辑器内写入下面的文件:
function y=sinsd(x)
%自变量x以“度”为单位。
%
%白城师院
%数学建模协会,2007-5-12
a=x/180*pi;
y=sin(a).^2;
将上面的文件保存之后即可随时调用。
命令:
t=sinsd(45)
t =
0.5000
命令:
help sinsd
命令:
t=sinsd([45,60])
t =
0.5000 0.7500
表明该函数对元素群运算有效。
上面的语句相当于
命令:
x=[45,60];t=sinsd(x)
t =
0.5000 0.7500
命令:
x=[45,60;30,90];f=sinsd(x)
f =
0.5000 0.7500
0.2500 1.0000
将源文件中最后一行的“.”去掉,再运行以上两条命令,我们会发现什么?
例8. 在MATLAB中,一个函数可以调用其它函数,也可以调用自身,即递归调用。
下面利用递归算法编写一个函数,用来计算Fibonacci数列的第k项。
Fibonacci数列:
1,1,2,3,5,8,13,21,……
M-函数文件:
function a=my_fibo(k)
if k==1|k==2,a=1;
else,a=my_fibo(k-1)+my_fibo(k-2);end 小括号是指一行的次序?
将这个文件写入M-文件编辑器并以名称“my_fibo.m”保存,以后就可以调用这个函数。
递归算法无疑是解决某一类问题的有效方法,但不宜滥用,因为它的运算速度往往很慢。
命令:
tic, n= my_fibo(26) ,toc
n =
121393
elapsed_time =
34.4290
下面我们尝试用一般的循环语句来求解这个问题。
程序:
tic,n=[1,1];for k=3:
100,n(k)=n(k-1)+n(k-2);end,toc,
elapsed_time =
0.0100
命令:
n(1:
26)
ans =
Columns 1 through 8
1 1 2 3 5 8 13 21
Columns 9 through 16
34 55 89 144 233 377 610 987
Columns 17 through 24
1597 2584 4181 6765 10946 17711 28657 46368
Columns 25 through 26
75025 121393
例9. 可变输入变量个数的函数
MATLAB提供的conv( )函数可用来求两个多项式的乘积。
对于多个多项式的连乘,则不能直接使用此函数,需要用该函数嵌套使用,用起来很不方便。
下面编写一个MATLAB函数,使它能直接处理任意多个多项式的乘积问题。
M-函数文件:
function a=convs(varargin)
a=1;
for i=1:
length(varargin)
a=conv(a,varargin{i});
end
形参varargin是一个特殊的字符串,它把输入变量列表转换成一个元胞数组,每一个输入变量都是这个元胞数组的一个元素。
下面调用这个函数,求解
d=(x4+2x3+4x2+5)(x+2)(x2+2x+3)
命令:
p=[1,2,4,0,5];q=[1,2];f=[1,2,3];
d=convs(p,q,f)
d =
1 6 19 36 45 44 35 30
命令:
convs(p,q,f,[1,1],[1,3],[1,1])
ans =
1 11 56 176 376 578 678 648 527 315 90
例10 关于break、continue、return的用法。
当程序运行过程中出现return命令时,程序停止运行。
break、continue用在循环语句中。
在循环语句中,如果遇到break命令时,程序结束当前的“for”或“while”循环,转而执行它下面最近的end以下的语句;遇到continue时,跳过当次循环而继续下一次的循环,例如,原定要循环5次,但在进入第3次循环时遇到了continue,则第3次的循环被跳过,而继续第4次、第5次的循环。
循环体实际上只重复执行了4次。
程序:
clear
str=’MATLAB R14.3 version’;
for i=1:
length(str)
if (~isletter(str(i)))
continue
end
result(i)=str(i);
end
result
result =
MATLAB R version
运行这个程序并观察结果。
然后再将程序中的语句continue改为break或return,看运行结果有何变化。