资源描述
MATLAB上机实验报告
专业:_姓名:
学号:
运行结果为:s= 55
例4:在区间[-2, -0.75 ]内,以步长0.25,对函数y =f (x) = l+1/x求值,并列表显示。
r=U;
s=[];
forx= -2.0:0.25:-0.75
y=l+l/x;
r=[rxj;
s=[s y];
end
[r; s]'
运行结果为
ans =
-2.0000
0.5000
-1.7500
0.4286
-1.5000
0.3333
-1.2500
0.2000
-1.0000
0
-0.7500
-03333
注意:for循环不能用循环内重新给循环变量赋值来终止
for循环的循环变审;[表达式1:表达式2:表达式3],其实为一行向后。 例5:用for循环求行向量卜2,5,3,6,-2]各元素之和。
3=1-2,53,6,-2];
s=0;
k=0;
for n=an%显示每一次循环变量的值
k=k+l;%记录循环次数s=s+n;%计算行向量a各元素之和
end
k,s%显示总的循环次数和计算结果
运行结果为
n =-2
n =5
n =3
n =6
n =-2
k=5
s=10
例6:观察以下程序的运行结果。
data=[3 9 45 6; 7 16 -1 5]
k=0;
for n=data%显示每一次循环变量的值
k=k+l; %记录循环次数x=n(l)-n(2)
endk%显示总的循环次数
运行结果为data =
39456716-15
n =37
x =-4n =9
16x =-7
n =45-1
x= 46n =6
5x =1
k =4
例7:以for循环求1 ! +2 ! +…+10!的值。
s=0;
for i=l:10P=l;
for j=l:iP=P*j;
end
s=s+p;
end
s
运行结果为
s=4037913
注意:for循环可嵌套使用。
例8:比拟下面两段程序的执行情况。
(a) for n=l:10x(n)=sin(n*pi/10);
end xn=l:10;
x=sin(n*pi/10)
两段程序的运行结果相同,均为x = 0.30900.58780.8090 0.95111.0000 0.95110.8090 0.5878
0.30900.0000
当有一个等效的数组方法来解给定的问题时,应防止用for循环。后者执行更快,更 直观、简便(2) while 循环
for循环的循环次数往往是固定的,而while循环可不定循环次数,其一般形式为 while关系表达式
语句 end 例9:分析以下程序的功能。
num=0; EPS=1;while (1+EPS)>1
EPS=EPS/2; num=num+l; end num=num-l EPS=2*EPS 运行结果为: num =52EPS =2.2204e-016
(3)if语句if语句的一般结构是
if表达式语句1else
语句2end例10:以for循环求容差变量EPS o EPS=1;
for n=l:100EPS=EPS/2;
if (1+EPS)<=1
EPS=EPS*2 break end end num = n-1 运行结果为EPS =2.2204e-016
num =52
例11:试用for语句和if语句创立以下矩阵:
5
1
0
0
0
1
5
1
0
0
0
1
5
1
0
0
0
1
5
1
0
0
0
1
5
A=[];
for k=l:5
for j=l:5if k==j
A(k,k)=5;elseif abs(k-j)==l
A(k,j)=l;else
A(k,j)=O;end
end
end
A运行结果为
A =
5
1
0
0
0
1
5
1
0
0
0
1
5
1
0
0
0
1
5
1
0
0
0
1
5
⑷switch语句switch语句的一般结构是
switch表达式case表达式1
语句1case表达式2
语句2case表达式n
语句notherwise
语句n+1
End
例12:试用switch语句完成卷面成绩score的转换:
80 > sco re 三
(1) score N90 分,优;(2)90 >score N80 分,良;(3)70 分,中;(4) 70 >score 260 分,及格;(5)60Vscore,不及格, score=input('请输入卷面成绩:score=');
switch fix(score/10)case 9
grade='优'case 8
grade='良,case 7
grade='4q'case 6
grade:,及格, otherwisegrade:'不及格
end运行结果为:请输入卷面成绩:score=87 grade = 良
(5)try语句
try语句是MATLAB特有的语句,其一般结构是
try 语句1
catch 语句2 end
例13:某图像文件名为pic ,但不知其存储格式为.bmp还是Jpg,试编程正确 读取该图像文件。
trypicture=imread(,pic.bmp,/bmp,);
filename='pic.bmp'; catch
picture=imread('pic.jpg7jpg'); filename=,pic.jpg';
end filename 运行结果为
filename = pic.jpg(6)程序流的控制
1. break 语句
终止本层for或while循环,跳转到本层循环结束语句end的下一条语句。
2. return 语句
终止被调用函数的运行,返回到调用函数pause 语句 其调用格式有
(1) pause :暂停程序运行,按任意键继续。
(2) pause(n):程序暂停运行n秒后继续。
(3) pause on/off :允许/禁止其后的程序暂停。
3. continue 语句
在for循环或while循环中遇到该语句,将跳过其后的循环体语句,进行下一次循环。
6.3数据的输入与输出.键盘输入语句(input) 其调用格式有
(l)x = input('prompt'):显示提示字符串prompt,,要求用户键盘输入x的值
(2) x = inputCprompt'/s'):显示提示字符串,promp匕要求用户键盘输入字符型变量x值2.屏幕输出语句(disp)
屏幕输出最简单的方法是直接写出欲输出的变量或数组名,后面不加分号。此外,可以 采用disp语句,其调用格式为disp(x)MATLAB文件操作
(l)fopen 语句
(1) fid = fopen(filename):以只读方式翻开名为filename的二进制文件,如果文件可以 正常翻开,那么获得一个文件句柄号fid ;否那么fid=-l。
(2) fid = fopen(filename,permission):以 permission 指定的方式翻开名为 filename 的二 进制文件或文本文件,如果文件可以正常翻开,那么获得一个文件句柄号fid(非0整数)否 那么 fid =-lo
(3) fclose 语句
(1) status = fclose(fid):关闭句柄号fid指定的文件。如果fid是已经翻开的文件句柄 号,成功关闭,status =0;否那么status = -1
(2) status = fclose('all'):关闭所有文件(标准的输入/输出和错误信息文件除外)。成功关 闭,status =0:否那么 status = -1例13编写函数,统计M文件中源代码的行数(注释行和空白行不计算在内)。
function y = lenm(sfile)
% lenm count the code lines of a M-file,
% not include the comments and blank lines
s=deblank(sfile);%删除文件名sfile中的尾部空格
if length(s)<2| | (length(s)>2&&any(lower(s(end-l:end))~='.m'))s=(s;.m,];%判断有无扩展名.m,假设没有,那么加上
end
if exist(s/'file')~=2;error([s/ not exist']);return;end%判断指定的m文件是否存在;假设不存在,那么显示错误信息并返回
fid=fopen(s;r');count=0;%翻开指定的 m 文件while 〜feof(fid);
line=fgetl(fid);%逐行读取文件的数据if isempty(line)| | strncmp(deblanks(line),'%',l);
%判断是否为空白行或注释行
continue;%假设是空白行或注释行那么执行下一次循环end
count=count+l;%记录源代码的行数end y=count;
%删除字符串中的首尾空格的函数
function st=deblanks(s);st=fliplr(deblank(fliplr(deblank(s))));
以lenm.m为例,调用并验证该函数。
» sfile='lenm';» y = lenm(sfile)
y= 17面向对象编程
⑴创立类目录
创立一个新类,首先应该为其创立一个类目录。
(2)建立类的数据结构
在MATLAB中,常用结构数组建立新类的数据结构,以存储具体对象的各种数据。
⑶创立类的基本方法
为了使类的特性在MATLAB环境中稳定而符合逻辑,在创立一个新类时,应该尽 量使用MATLAB类的标准方法。
例14:创立一个名为curve的对象。
(1)首先创立一个类目录@curve,放在 c:\my_classe 目录下,即 c:\my_classes\@curve, 通过addpath命令将类目录增加到MATLAB的搜索路径中:
addpath c:\my_classes;
(2)创立对象构造函数。具体如下:
function c=curve(a)%curve类的对象构造函数
%c = curve创立并初始化一个curve对象%参数a为1X2的细胞数组,a{l}为函数名,a{2}为函数描述
%函数必须和fplot要求的形式相同,即y = f(x),参见fplot %如果没有传递参数,那么返回包含x轴的一个对象
if nargin==0%在此情况下为默认的构造函数c.fcn=";
c.descr=";c=class(c;curve,);%返回一个不能对类方法访问的空结构curve对象
elseif isa(a, 'curve')c=a;%如果传递的参数是一个curve对象,那么返回该
对象的副本
elseif (ischar(a{l}) & ischar(a{2}))c.fcn=a{l};
c.descr=a{2};c=class(cz 'curve'); %返回一个 curve 对象
elsedispf'Curve class error #1: Invalid argument.')
%如果传递的参数是错误类型,那么将给出错误信 息
End
为了画出curve对象的曲线,创立plot方法如下:
function p=plotl(cz limits)% curve.plotl在limits指定的区域中画出对象curve的图形
% limits为x轴的坐标范围([xmin xmax]),% 或 x、y 轴的坐标范围([xmin xmax ymin ymax]).
step=(limits(2)-limits(l))/40;
x=limits(l):step:limits(2);%画出函数图形
fplot(c.fcnjimits);
title(c.descr);执行以下命令:
» parabola=curve({'x*x',抛物线'})
parabola = curve object: 1-by-l
» plotl(parabola,[-2 2]);MATLAB程序优化
(1)预先声明数组空间。这样MATLAB就不必在每次输出结果时都重新调整数组的 大小
(2)代码向量化。向量化主要是指用向量操作代替传统的循环语句,作为面向矩阵 运算的语言
(3)在if,while和switch等语句中使用产生标量结果的条件表达式,可以加快判断语句
(4)输入/输出数据时尽量使用函数load和save,它们比低级I /0文件函数快。
(5)把程序中耗时的局部单独用C语言或Fortranc语言写成MEX文件,通常能 提高运行速度
(6) MATLAB 7.0集成开发环境是用JVM实现的。可以启动不带集成环境的 MATLAB(执行MATLAB-nojvm命令启动)以增加程序执行时的可用内存。
(7)在程序中随时清除不再使用的大数组以释放内存,例如clearA或A =[]o
(8)由于MATLAB采用堆栈技术管理内存,因此为了防止内存碎片,可在程序中多 次调用函数Pack o
(9)利用代码剖析工具profile全面优化程序设计。
6.4 程序调试
MATLAB提供了一系列程序调试命令,利用这些命令,可以在调试过程中设置、清除和 列出断点,逐行运行M文件,在不同的工作区检查变量,用来跟踪和控制程序的运行,帮 助寻找和发现错误。
6.5 习题.简述使用m文件与在MATLAB窗口中直接输入命令有何异同,有何优缺点
答:相同点:M文件和命令窗口一样都可以运行程序,命令是相同的
不同点:①直接输入不能保存,M文件可以保存;②直接输入遇到多语句命令时,比 较麻烦,而M文件就没有这个问题;③直接输入可以直接显示每步的结果,可以及时修改; ④M文件要运行时检查错误。⑤函数只能用M文件来写。@M文件可以重复使用,而直 接输入命令不能重复
命令窗口的优点:简单快捷又强大;缺点:可重复性低,不便于次的重复运算和程序的 修改;
M文件的优点:能自己加入函数,程序,编程语言,易于寻找错误,易于修改,可储 存;缺点:需要创立文件,计算简单的数据时不如命令窗口快捷.简述脚本形式的M文件与函数形式的M文件的异同?
答:(1)相同点:脚本文件与函数文件的相同点是都具有M文件的基本特点,如保存 格式为ASCII码的形式,符合命名规那么.
(2))不同点:脚本文件是命令的集中,只需输入脚本文件名,就可以一次执行所有命 令。没有输入、输出参数,没有参数传递功能,文件名可以任意取,一般需要由其他语句调 用,
函数文件的首行语句必须以function开始,有函数名,文件名必须与函数名一致,函数 空间生成的变量是局部变量。可以包含输入输出参数,有参数传递功能。
1 .编写一个函数projectl.m ,其功能是判断某一年是否为闰年。
解:function result=projectl(n)
if((mod(n/4)==0 && mod(n,100)~=0 )| | (mod(n,400)==0 && mod(nz100)==0))disp(,此年是闰年为
elsedispC此年不是闰年,);
end
4 .编制一个函数,使得该函数能对输入的两个数值进行比拟并返回其中的最小值解:x=input('输入数值:x=');
y=input(,输入数值:y=');if x>y
min=y;else
min=x;end
min
5 .试计算以下循环语句操作的步数。
(l)for i=-1000:1000循环次数:2001
(2)forj=l:2:20循环次数:10
6 .观察以下循环语句,计算每个循环的循环次数和循环结束之后var的值。
(1) var=l;while mod(varz10)~=0
var=var+lend
var=10循环次数:9次
(2) var=2;while var<=100
var=varA2;
endvar=256循环次数:3次
(3) var=3;while var>100
var=varA2;end
var=3 循环次数:0次
7.假设有一整数矩阵A ,请编制一个函数,将此整数矩阵以ASCII码的整数方式储存 在文件之中。例如当矩阵A的内容如表6-6所示。
123456
那么储存于文件的内容为
123
456解:»A=[];a=l;
»for k=l:2for j=l:3
A(kJ)=a;a=a+l;
end end
8.先将A=magic(10)的数据以uint8的数据类型存入一个二进制文件mytest.bin中, 执行命令(write ;再执行命令fread将此魔方阵读至工作空间的一个变量。
解:A=magic(10);
fid = fopenCmytest.bin'/wb');
fwrite(fid,A/uint8');
fclose(fid);
fid = fopen('mytest.bin7rb');
B=fread(fid,[10/10];uint8')
fclose(fid);
实验五
-‘、实验目的3
二、实验内容3
三、实验步骤3
1 . M文件的编辑3
2 .程序流程控制结构3for循环结构4
1) while循环结构5练习5
2) if-else-end 分支结构5) switc-case 结构6
3 .子函数和参数传递6练习7
4 . 局部变量和全局变量8MATLAB上机练习
6.1 M文件8
(1)脚本文件8
(2)函数文件-9MATLAB的程序控制结构
9
(2) while 循环-12
(3)if 语句12
(4)switch 语句13
(5)try 语句14
⑹程序流的控制14数据的输入与输出14
(1)键盘输入语句 14
(2)屏幕输出语句14MATLAB文件操作
(l)fopen 语句15
(2) fclose 语句15面向对象编程15
⑴仓犍类目录 15
(2)建立类的数据结构 15
(3)创立类的基本方法16MATLAB程序优化17
6.2 程序调试17
实验五MATLAB程序设计一、实验目的
掌握MATLAB程序设计的主要方法,熟练编写MATLAB函数。
二、实验内容
(1)M文件的编辑。
(2)程序流程控制结构。
(3)子函数调用和参数传递。
(4)局部变量和全局变量。
三、实验步骤.M文件的编辑
选择MATLA的菜单File|New|M-file,翻开新的M文件进行编辑,然后输入以下内容, 并保存文件名为expl.mo%M脚本文件
%功能:计算自然数列1〜100的数列和
s=0;
for n=l:100s=s+n;
end
s运行结果:s= 5050
保存好文件后,在命令窗口输入expl即可运行该脚本文件,注意观察变显空间。接 着创立M函数文件,然后输入以下内容,并保存文件名exp2.m%这是M函数文件
%功能:计算自然数列1〜x的数列和
function s=exp2(x)s=0;
for n=l:xs=s+n;
end
保存好文件后,在命令窗口输入
»clear
»s=exp2(100)
open%命令可以翻开M文件进行修改
»open conv%翻开 conv 函数运行结果:s= 5050
1 .程序流程控制结构
1) for循环结构
for n=l:10n end
运行结果:
n =
1 n =
2 n =
3n =
4n =
5n =
6n =
7n =
8n =
9n =
10另一种形式的for循环:
n=10:-l:5
的列数
for i=n%循环的次数为向量i
end
运行结果:
n =
1098765i =
10i =
9i =
8i =
7i =
5while循环结构 在命令窗口输入: »clear,clc;
x=l;
while 1x=x*2
end运行结果:
x =
Infx =
Inf
将会看到MATLAB进入死循环,因为while判断的值恒为真,这时须按下Ctrl +C键 来中断运行,并且可看到x的值为无穷大。
练习2) while循环结构:(1)请把exp2.m函数文件用while循环改写。
解:function s=exp2(x)s=0;
n=0;
while n<=xs=s+n;
n=n+l;
end
运行结果:exp2(100)ans =5050
(2)用兀/4 =l-l/3+l/5-l/7+…公式求兀的近似值,直到最后一项的绝对值小于10 为止,试编写其M脚本文件。
n=0;
s=O;k=l;while k>10e-6
s=s+(-l)An/(2*n+l);
k=l/(2*n+l);
n=n+l;end
pi=4*s运行结果pi = 3.1416
2) if-else-end 分支结构
if-else-end分支有如下3种形式。
(a) if表达式语句组1
end
(b) if表达式语句组1
else
语句组2 end
(c) if 表达式A语句组1
elseif 表达式B语句组2
elseif语句组3
else语句组n
Endswitch-case 结构
创立M脚木文件exp3.m,输入以下内容并在命令窗口中运行。
%功能:判断键盘输入的数是奇数还是偶数n=input('n='); if isempty(n)
error('please input n')
end
switch mod(n,2)
case 1A』奇数'
case 0A8偶数'
end运行结果:
n=2018
A=偶数
n=2019
A =奇数
3.子函数和参数传递x
有一个函数g(x) En! (x =1,2,3…),试编写实现该函数的函数文件。 n 1
function g=exp4(x)%主函数
g=0;for n=l:x g=g+fact(n);%调用子函数
%子函数
end
function y=fact(k) y=i;
for i=l:ky=y i;
end
输入参数可以由函数nargin计算,下面的例子sinplot2(),当只输入一个参数w 时,sinplot2()函数会给p赋予默认值0。 function y=sinplot (w,p)
if nargin>2erro(ztoo many input')
end
if nargin==l
P=0;
end
x=linspace(0,2*pi,500);
z=sin(x.*w+p);练习:(1)编写求矩形面积函数rect ,当没有输入参数时,显示提示信息;当只输入一个参 数时,那么以该参数作为正方形的边长计算其面积;当有两个参数时,那么以这两个参数为长 和宽计算其面积。
解:
function s=rect(xzy)
switch(nargin)
case 0
error('illegal argument');
case 1
s=x*x;
case 2
s=x*y;end
(2)编写一个字符串加密函数nch=my_code(ch,x),其中ch是字符串参数,x为整 数;加密方法是:把ch的每一个字符的ASCII码值加上x ,得到的即为加密后的新的字符 串nch o由于可显示ASCH码值是有范围的(32 , 126),因此当得到的ASCII码值大于126 时,需要减去93。同理,再编写一个解码函数nch=my_dcode(ch ,x)。
提示:char(32:126)可获得ASCII码值为32〜126的字符。
解:
力口密:function nch=my_code(ch,x) nch=ch+x;if nch>126
nch=nch-95;
char(nch)else
char(nch)end
解码:function nch=my_code(ch,x)
nch=ch-x;if (nch<32)
nch=nch+95;char(nch)
elsechar(nch)
4.局部变量和全局变量
自程序执行开始到退出MATLAB ,始终存放在工作空间,可被任何命令文件和数据文 件存取或修改的变量即是全局变量,全局变量可用于函数之间传递参数,全局变量用关键 字global声明。
编写一个求和的函数文件,其名为summ.m.程序如下:
function s=summ
global BEG END
k=BEG:END;
s=sum(k);
再编写调用M脚本文件use.m来调用summ.m函数文件,它们之间通过全局变量传递 参数。
程序如下:
global BEG END
BEG=1;
END=10;
sl=summ;
BEG=1;
END=20;
s2=summ;MATLAB上机练习
6.1 M文件
(1)脚本文件
脚本文件是M文件中最简单的•种,不需要输入顿号输出参数,用命令语句可以控制 MATLAB命令工作空间的所有数据。
例1:编程计算向量元素的平均值。
>> x=input('输入向量:x=');[mzn] =size(x);%判断输入量的大小
if~((m==l)|(n==l))| ((m==l)& (n==l)) %判断输入是否为向量error('必须输入向量。,)
end
%计算向量x所有元素的平均值
average=sum(x)/length(x) 输入向量:x=[l 2 3]average =2
(2)函数文件
如果M文件的第一个可执行语句以function开始,该文件就是函数文件,每一个函数文件都定义一个函数。MATLAB提供的函数命令大局部都是由函数文件定义的. 例2:编写函数average_2()用于计算向量元素的平均值。
function y=average_2(x)%函数average_2(x)用以计算向量元
%素的平均值。
%输入参数x为输入向量,输出参数y%为计算的平均值。
%非向量输入将导致错误。
[m,n]=size(x);
%判断输入最的大小if-((m==l)| (n==l))| ((m==l)& (n==l)) % 判断输入是否为向量 error('必须输入向量。,)
y=sum(x)/length(x);%计算向量x所有元素的平均值
(3)函数调用
调用函数文件的一般格式为【输出参数表上函数名(输入参数表)
调用函数时应注意:
(1)当调用一个函数时,输入和输出参数的顺序应与函数定义时的一致,其数目可以按 少于函数文件中所规定的输入和输出参数调用函数,但不能使用多于函数文件所规定的输入 和输出参数数目。
(2)在编写函数文件调用时常通过nargin、nargout函数来设置默认输入参数,并决定 用户所希望的输出参数。
(3)当函数有一个以上输出参数时,输出参数包含在方括号内。
(4)当函数有一个或多个输出参数,但调用时未指定输出参数,那么不给输出变量赋任何 值。
(5)函数有自己的独立工作空间,它与MATLAB的工作空间分开。除非使用全局变量, 函数内变量与MATLAB其他工作空间之间唯一的联系是函数的输入和输需参数。
6.2 MATLAB的程序控制结构(1) for循环
for循环允许一组命令以固定的和预定的次数重复。for循环的一般形式是 for循环控制变量=表达式1:表达式2:表达式3语句
End
例3:求$=1>的值。n从1到10
s=0;
for n=l:10s=s+n;
end
展开阅读全文