第三章 MATLAB程序设计基础.docx
《第三章 MATLAB程序设计基础.docx》由会员分享,可在线阅读,更多相关《第三章 MATLAB程序设计基础.docx(11页珍藏版)》请在冰豆网上搜索。
第三章MATLAB程序设计基础
第三章MATLAB程序设计基础
chapter3:
FoundationofMATLABprogramdesign
(1)M文件有两种形式:
命令(脚本)文件(ScriptFile)和函数文件(FunctionFile)
2.命令文件:
(ScriptFile)M文件中最简单的一种,是可用于自动重复执行的一组MATLAB命令和函数组合,不需输出输入参数,用M文件可以调用工作空间已有的变量或创建新的变量。
运行过程中产生的变量都是全局变量。
建立一个命令文件等价于从命令窗口中顺序输入文件里的命令,程序不需要预先定义,只要依次将命令编辑在命令文件中,再将程序保存成为扩展名为.m的M文件即可。
运行命令文件时,只需在命令窗口键入文件名即可。
例:
用三角函数计算画出花瓣图形。
theta=-pi:
0.01:
pi;
rho(1,:
)=2*sin(5*theta).^2;%计算四种不同rho
rho(2,:
)=cos(10*theta).^3;
rho(3,:
)=sin(theta).^2;
rho(4,:
)=5*cos(3.5*theta).^3;
fork=1:
4
Subplot(2,2,k),
polar(theta,rho(k,:
))
end
将程序保存成名为petals的M文件,并运行。
注:
(1)‘%‘引导注释行,不予执行;
(2)不需要用“end”作为M文件的结束标志;
(3)若文件存放在自己的目录上,在运行文件前,应先将自己的目录设置为当前工作目录。
最简单方法:
在当前目录浏览器中设置。
(4)运行后存放在工作空间的变量可以用工作空间浏览器查看。
3。
函数文件(FunctionFile)
如果M文件的第一个可执行行以function开始,便是函数文件,每一个函数文件定义一个函数。
函数文件区别于命令文件之处在于命令文件的变量在文件执行完成后保留在工作空间中,而函数文件内定义的变量只在函数文件内起作用,文件执行完后即被清除。
例:
建立average函数用于计算矢量中单元的平均值。
functiony=average(x)
[m,n]=size(x);
if(~((m==1)|(n==1))|(m==1&n==1))
error('Inputmustbeavector')
end
y=sum(x)/length(x);
将文件存盘,缺省状态下自动存储名为average.m的函数。
这样只要接受一个输入参数便可计算返回一个输出参数,与其他MATLAB函数一样使用。
例:
用已建立的average函数文件求1~99的平均值。
z=1:
99;
average(z)
函数文件的基本组成部分:
(1)函数定义行:
(thelinesforfunctionidentification)由function引导,并定义函数名、输入参数和输出参数,函数定义行必须放在文件的第一个可执行上。
可以设多个输入输出参数,如:
function[x,y,z]=sphere(theta,phi,rho)
也可以没有输出参数,如:
functionprintresults(x)
1.局部变量与全局变量(LocalvariableandGlobalvariable)
用global就可以把一个变量定义为全局变量。
MATLAB中变量名是区分大小写的,习惯上常将大写字母定为全局变量。
如:
globalABC
三.程序结构(Structureofprogram)
8种控制程序流程(controlflowstatement)的语句:
for,while,if,switch,try,continue,break,return
1。
循环语句(Loopstatement)
(1)for语句:
forv=表达式通常为一个矢量,形式为:
m:
s:
n(初值:
步长:
終值)
语句体
end
例:
n=10
fori=1:
n
x(i)=(i+1).^2;
end
x
x=
49162536496481100121
例:
嵌套循环:
注意与end的配对。
m=3;n=4;
fori=1:
m
forj=1:
n
a(i,j)=1/(i+j-1);
end
end
formatrat
a
a=
11/21/31/4
1/21/31/41/5
1/31/41/51/6
例:
运用非1步长,产生0-20以内的偶数
fori=0:
2:
20
a(i/2+1)=i;
end
a
a=
02468101214161820
(2).While语句:
为条件循环语句。
循环不确定次数,只要表达式的结果非零,语句体就重复执行,直到循环条件不成立为止。
While表达式
语句体
end
例:
while循环,求解n!
达到100位数的第一个n是多少。
n=1;
whileprod(1:
n)<1e100%“prod——数组乘积”
n=n+1;
end
n
n=
70
2.条件语句(Selectionstatement)
(1)if—end语句(simpleifstatement)
if表达式
语句体
end
(2)if—else--end语句
if表达式
语句体1;
else
语句体2:
end
当计算的表达式结果为真时执行语句体1,结果为假时执行语句体2。
例:
判断学生是否通过学业。
if((attendance>=0.90)&(grade>=60))
pass=1;
else
fail=1;
end
(1)if—elseif—end语句
if表达式1
语句体1;
elseif表达式2
语句体2;
else
语句体3;
end
例:
用色彩区分数据点的范围。
n=100;
x=1:
n;
y=randn(1,n);
holdon
fori=1:
n
ify(i)<-1
plot(x(i),y(i),'*g')
elseify(i)>=-1&y(i)<=1
plot(x(i),y(i),'ob')
elseify(i)>=1
plot(x(i),y(i),'xr')
end
end
holdoff
(3)分支语句:
switch—case—end
通过对某个变量值的比较做各种不同的执行选择。
形式:
switch表达式(数字或字符串)
case数字或字符串1
语句体1;
case数字或字符串2
语句体2;
……
otherwise
语句体n;
end
例:
检查input_num的数值.
switchinput_num
case-1
disp(‘negativeone’);%当input_num=-1时显示
case0
disp(‘zero’);%当input_num=0时显示
case1
disp(‘positiveone’);%当input_num=1时显示
otherwise
disp(‘othervalue’);%当input_num等于其他值时显示
end
(5)其他流程控制语句:
(Othercontrolflowstatement)
(a),continue语句:
用于控制for循环和while循环跳过某些执行语句。
C:
\MATLAB7\toolbox\matlab\elmat\magic.m
例:
continue语句的用法.
fid=fopen('magic.m','r');%打开文件
count=0;%计数器置零
while~feof(fid)%判断是否到文件末尾
line=fgetl(fid);
ifisempty(line)|strncmp(line,'%',1)
%判断是否为空行或注释行
continue%如果是空行或注释行继续下一次循环
end
count=count+1;%如果不是空行或注释行计数器加1
end
disp(sprintf('%dlines',count));%显示行数
25lines
(b).break语句:
用于终止for循环和while循环的执行.
C:
\MATLAB7\toolbox\comm\comm\@gf\fft.m
例:
break语句的用法.
fid=fopen(‘fft.m’,’r’);%打开文件
s=’‘;%清空字符数组
while~feof(fid)%判断是否为文件末尾
line=fgetl(fid);%从文件中读行
ifisempty(line)%如果是空行
break%如果是空行退出循环
end
s=strvcat(s,line);%如果不是空行,纵向连接字符数组
end
disp(s)%显示字符数组结果
(c)return语句:
用于终止当前的命令序列,并返回到调用的函数或键盘。
例:
return语句的用法.
functiond=det(A)%定义函数det(A)计算矩阵A的行列式
ifisempty(A)%如果矩阵是空的
d=1;
return%返回调用函数
else
…%计算过程略
end
附:
1、命令窗口数据直接输入输出语句(Input)
可利用语句中输入的字符串内容提示用户在命令窗口直接输入程序运行所需的某些参数,
调用格式:
R=INPUT('Howmanyapples'):
执行后出现提示字符串,输入的内容可以是MATLAB可估值的任何表达式.输出保存在变量R中。
R=INPUT('Whatisyourname','s'):
执行后出现提示字符串,等待字符串输入,字符串直接输出为MATLAB字符串形式。
例:
编制可由命令窗口输入被处理温度数据的程序。
k=input('选择转换方式(1--摄氏转换为华氏,2--华氏转换为摄氏):
');
ifk~=1&k~=2
disp('请指定转换方式')
return
end
tin=input('输入待转变的温度(允许输入数组):
');
ifk==1
tout=tin*9/5+32;%摄氏转换为华氏
k1=2;
elseifk==2
tout=(tin-32)*5/9;%华氏转换为摄氏
k1=1;
end
str=['C';'F'];
disp(['转换前的温度','','转换后的温度'])
disp(['',num2str(tin),str(k,:
),'',num2str(tout),str(k1,:
)])
%不同的样条插值函数应用方法:
yi=interp1(x,y,xi,‘method’)
yi=method(x,y,xi)
例:
有一正弦衰减数据y=sin(x).*exp(-x/10),其中x=0:
pi/5:
4*pi,用三次样条法进行插值。
未插值:
x0=0:
pi/5:
4*pi;
y0=sin(x0).*exp(-x0/10);
plot(x0,y0)
方法1:
x0=0:
pi/5:
4*pi;
y0=sin(x0).*exp(-x0/10);
x=0:
pi/20:
4*pi;
y=spline(x0,y0,x);
plot(x0,y0,'or',x,y,'b')
方法2:
x0=0:
pi/5:
4*pi;
y0=sin(x0).*exp(-x0/10);
x=0:
pi/20:
4*pi;
y=interp1(x0,y0,x,’splin’)
plot(x0,y0,'or',x,y,'b')