第4章 MATLAB语言的程序设计

合集下载

《MATLAB程序设计》教学大纲

《MATLAB程序设计》教学大纲

《MATLAB程序设计》教学大纲一、课程介绍本课程是一门针对计算机科学和工程学专业的研究生开设的课程,旨在通过教授MATLAB编程语言的基础知识和应用技能,培养学生掌握利用MATLAB解决实际问题的能力。

二、课程目标1.熟悉MATLAB编程语言的基本语法和数据类型;2.掌握MATLAB的函数定义和调用,以及文件的读写操作;3.理解MATLAB中的控制结构,包括条件语句和循环语句;4.学会使用向量和矩阵进行数据处理和分析;5.能够利用MATLAB进行图形绘制和数据可视化;6.培养独立解决问题和团队合作能力。

三、教学内容和安排1.MATLAB简介和基本操作(2学时)-MATLAB的历史和应用领域;-MATLAB的安装和界面介绍;-MATLAB的基本操作和运行脚本文件。

2.MATLAB的变量和数据类型(4学时)-MATLAB变量的定义和赋值;-MATLAB的基本数据类型和操作;-字符串处理和函数调用。

3.MATLAB的函数和文件操作(6学时)-函数定义和调用;-函数输入和输出参数;-文件的读写操作和数据存储。

4.MATLAB的控制结构(8学时)-条件语句和逻辑运算;-循环语句和迭代算法;-MATLAB中的异常处理和调试技巧。

5.MATLAB中的向量和矩阵操作(10学时)-向量和矩阵的定义和运算;-矩阵的乘法和求逆;-线性方程组的求解。

6.MATLAB的数据处理和分析(8学时)-数据的导入和清洗;-数据的统计和分布;-数据可视化和图形绘制。

7.MATLAB的高级应用(6学时)-符号计算和数值积分;-离散信号处理和滤波器设计;-优化算法和机器学习。

8.MATLAB的项目实践(6学时)-小组项目的选题和设计;-项目实施和数据分析;-结果展示和总结。

四、教学方法1.理论讲授:通过课堂教学讲解MATLAB的基本语法和概念;2.实例演示:结合真实案例和实际问题,演示如何使用MATLAB进行编程和数据处理;3.实践操作:针对每个知识点,布置对应的编程练习和项目实践,加强学生的实际操作能力;4.小组讨论:鼓励学生在小组内讨论和合作解决问题,提高团队合作和沟通能力;5.课程实践:通过开展项目实践,提供学生实践应用MATLAB解决实际问题的机会。

《MATLAB_程序设计与应用》刘卫国高等教育出版社-第4章课后答案

《MATLAB_程序设计与应用》刘卫国高等教育出版社-第4章课后答案

第四章1.a=input('请输入一个4位数:');while (a<1000|a>9999)a=input('输入错误,请重新输入一个4位数:'); endb=fix(a/1000);c=rem(fix(a/100),10);d=rem(fix(a/10),10);e=rem(a,10);b=b+7;c=c+7;d=d+7;e=e+7;b=rem(b,10);c=rem(c,10);d=rem(c,10);e=rem(e,10);g=b;b=d;d=g;g=c;c=e;e=g;a=1000*b+100*c+10*d+e;disp(['加密后:',num2str(a)])2.逻辑表达式法:a=input('请输入a: ');b=input('请输入b: ');c=input('请输入c: ');x=0.5:1:5.5;x1=(x>=0.5&x<1.5);x2=(x>=1.5&x<3.5);x3=(x>=3.5&x<=5.5);y1=a.*(x.^2)+b.*x+c;y2=a*(sin(b)^c)+x;y3=log(abs(b+c./x));y=y1.*x1+y1.*x2+y3.*x3; disp(y)if语句法:a=input('请输入a: ');b=input('请输入b: ');c=input('请输入c: ');for x=0.5:1:5.5if x>=0.5 & x<1.5y=a.*(x.^2)+b.*x+celseif x>=1.5 & x<3.5y=a*(sin(b)^c)+xelseif x>=3.5 & x<5.5y=log(abs(b+c./x))endendswitch语句法:a=input('请输入a: ');b=input('请输入b: ');c=input('请输入c: ');for x=0.5:1:5.5switch floor(x/0.5)case {1,2}y=a.*(x.^2)+b.*x+c;case {3,4,5,6}y=a*(sin(b)^c)+x;case {7,8,9,10}y=log(abs(b+c./x)); enddisp(y)end3.x=fix(rand(1,20)*89)+10;x1=mean(x);n=find(rem(x,2)==0 & x<x1);disp(['小于平均数的偶数是:',num2str(x(n))]);4.(1)A=input('请输入20个数的一个行向量:');a=A(1);b=A(1);for m=Aif a>=ma=m;elseif b<=mb=m;endenddisp(['最小数是:',num2str(a)])disp(['最大数是:',num2str(b)])(2)A=input('请输入20个数的一个行向量:'); maxval=max(A)minval=min(A)5.s=0;for a=0:63c=2^a;s=s+c;enddisp(['2的0次方到63次方的和是:',num2str(s)])k=0:63n=2.^ks=sum(n)6.(1)sum1=0;for n=1:100x=(-1)^(n+1)*(1/n);sum1=sum1+x;enddisp(['当n取100时: sum=',num2str(sum1)])sum2=0;for n=1:1000x=(-1)^(n+1)*(1/n);sum2=sum2+x;enddisp(['当n取1000时: sum=',num2str(sum2)])sum3=0;for n=1:10000x=(-1)^(n+1)*(1/n);sum3=sum3+x;enddisp(['当n取10000时:sum=',num2str(sum3)])(2)sum1=0;n1=0;for n=1:2:100x=(-1)^n1*(1/n);sum1=sum1+x;n1=n1+1;enddisp(['当n取100时: sum=',num2str(sum1)])sum2=0;n2=0;for n=1:2:1000x=(-1)^n2*(1/n);sum2=sum2+x;n2=n2+1;enddisp(['当n取1000时: sum=',num2str(sum2)])sum3=0;n3=0;for n=1:2:10000x=(-1)^n3*(1/n);sum3=sum3+x;n3=n3+1;enddisp(['当n取10000时:sum=',num2str(sum3)])(3)sum1=0;for n=1:100x=1/(4^n);sum1=sum1+x;enddisp(['当n取100时: sum=',num2str(sum1)])sum2=0;for n=1:1000x=1/(4^n);sum2=sum2+x;enddisp(['当n取1000时: sum=',num2str(sum2)])sum3=0;for n=1:10000x=1/(4^n);sum3=sum3+x;enddisp(['当n取10000时:sum=',num2str(sum3)])(4)sum1=1;for n=1:100x=4*n*n/(2*n-1)/(2*n+1);sum1=sum1*x;enddisp(['当n取100时: sum=',num2str(sum1)])sum2=1;for n=1:1000x=4*n*n/(2*n-1)/(2*n+1);sum2=sum2*x;enddisp(['当n取1000时: sum=',num2str(sum2)])sum3=1;for n=1:10000x=4*n*n/(2*n-1)/(2*n+1);sum3=sum3*x;enddisp(['当n取10000时:sum=',num2str(sum3)])7.函数文件function f=fibnacci(n)if n==1 | n==2f=1;elsef=fibnacci(n-1)+fibnacci(n-2);end命令文件:shulie=[];for k=1:nshulie=[shulie fibnacci(k)];endshulie8.function [f1,f2]=juzhenji(x1,x2)f1=x1*x2;f2=x1.*x2;命令文件:clear alla=input('请输入一个矩阵:');b=input('请再输入一个矩阵:(注意:两矩阵要可以相乘)'); [f1,f2]=juzhenji(a,b);disp(f1)disp(f2)9.function sum=qiuhe(n,m)if n<=1sum=0;elsesum=n^m+qiuhe(n-1,m);end命令文件:clear ally=qiuhe(100,1)+qiuhe(50,2)+qiuhe(10,-1);disp(y)10.s=0;a=[12,13,14;15,16,17;18,19,20;21,22,23];for k=afor j=1:4if rem(k(j),2)~=0 s=s+k(j);endendendss =108(2)global xx=1:2:5;y=2:2:6;sub(y);xyfunction fun=sub(z) global xz=3*x;x=x+z;x =4 12 20 y =2 4 6。

matlab程序设计与应用

matlab程序设计与应用

matlab程序设计与应用Matlab是一款高效能的编程语言,具有高品质的计算和分析功能,近十多年来被广泛应用在工程计算、科学研究、商业分析、金融模拟和教育工作等多个领域。

它拥有一系列强大的算法编写功能,可以实现非线性矩阵求解、信号处理、图像处理、生物医学信号处理等功能。

本文将介绍Matlab程序设计与应用,以及它在工程计算、科学研究、商业分析等领域的应用和示例。

一、Matlab程序设计Matlab是一种操作方便的高级编程语言,立足于原始编码,它建立在C及FORTRAN之上,而且它的高级结构使得设计程序不必写成复杂的程序框架,而可以把主要精力放在要实现的功能上。

Matlab在程序设计方面支持面向对象编程(Object-oriented programming,OOP)方式,可以实现结构化的程序设计,把大量的程序按照模块和函数来管理,方便调用和重用,并可以利用Matlab的类和类的方法来实现程序的重用和拓展。

二、Matlab在工程计算领域的应用Matlab在工程计算领域的应用如下:(1)Matlab可以用于科学计算,如:数值分析、科学计算、多元函数拟合、图像处理以及信号处理等。

(2)Matlab可以用于设计和调试电子电路,如:数字电路、模拟电路、射频电路、功率电路以及控制电路等。

(3)Matlab可以用于控制系统分析,如:数模转换、频响函数以及过程控制等。

(4)Matlab可以用于机械结构设计,如:机械结构分析、运动学以及动力学等。

三、Matlab在科学研究和商业分析领域的应用Matlab在科学研究和商业分析领域的应用如下:(1)Matlab可以用于统计学研究,如:概率统计、偏差分析、多元分析以及非参数分析等。

(2)Matlab可以用于数据挖掘,如:决策树分类、聚类分析以及因子分析等。

(3)Matlab可以用于仿真研究,如:求解方程、模拟实验以及模型预测等。

(4)Matlab可以用于商业分析,如:市场调研、销售预测以及风险评估等。

MATLAB程序设计

MATLAB程序设计

MATLAB程序设计MATLAB提供了一个完善的程序设计语言环境,使用户能够方便地编制复杂的程序,完成各种计算。

本节先介绍关系运算、逻辑运算,再介绍M-文件(即程序文件)的结构及MATLAB的程序控制流语句。

一、关系运算和逻辑运算1.关系运算(1)关系运算符:< ;< = ;> ;> = ;= = ;~ =(2)关系表达式:用关系运算符将两个同类型的量(表达式)连接起来的式子。

【注】①关系运算本质上是标量运算,关系表达式的值是逻辑值(0-假1-真);②当作用于两个同样大小矩阵时,则分别对两个矩阵的对应元素运算,结果是一个0-1矩阵。

例1.对向量进行关系运算。

>> A=1:5,B=5:-1:1 % 输入向量A = 1 2 3 4 5B = 5 4 3 2 1>> C=(A>=4) % 对向量进行关系运算C = 0 0 0 1 1>> D=(A==B) % 对向量进行关系运算D = 0 0 1 0 02.逻辑运算(1)逻辑运算符:& (and,与)、| (or,或)、~ (not,非)(2)逻辑表达式:用逻辑将两个逻辑量连接起来的式子。

【注】①逻辑运算本质上是标量运算,它将任何非零元素视为1(真);②当作用于两个同样大小矩阵时,则分别对两个矩阵的对应元素运算,结果是一个0-1矩阵。

(真值表见P27)例2.对向量进行逻辑运算。

>> a=1:9,b=9-aa = 1 2 3 4 5 6 7 8 9b = 8 7 6 5 4 3 2 1 0>> c=~(a>4) % 非运算c = 1 1 1 1 0 0 0 0 0>> d=(a>=3)&(b<6) % 与运算d = 0 0 0 1 1 1 1 1 13.逻辑函数any(x) 向量x 中有非零元返回1,否则返回0。

(向量函数) all(x) 向量x 中所有元素非零返回1,否则返回0。

基于MATLAB的控制网平差程序设计--第四章源代码

基于MATLAB的控制网平差程序设计--第四章源代码

chkdat函数(72页)function [n1,k]=chkdat(sd,pn,n1)n=length(n1);k=0;for i=1:ni1=0;for j=1:sdif(n1(i)==pn(j))i1=1;n1(i)=j;break;endendif(i1==0)% fprintf(fit2,'%5d %5d\n',i,n1(i)k=1;endendreturnreadlevelnetdata函数(73页)function [ed,dd,sd,gd,pn,h0,k1,k2,h1,s]=readlevelnetdata global filename filepath;global ed dd sd pn gd h0 k1 k2 h1 s k11 k12;k1=[];k2=[];h=[];s=[];[filename,filepath]=uigetfile('*.txt','选择高程数据文件');fid1=fopen(strcat(filepath,filename),'rt');if(fid1==-1)msgbox('Input File or Path is not correct','Warning','warn');return;ended=fscanf(fid1,'%f',1);dd=fscanf(fid1,'%f',1);sd=ed+dd;gd=fscanf(fid1,'%f',1);pn=fscanf(fid1,'%f',sd);h0=fscanf(fid1,'%f',ed);h0(dd+1:ed+dd)=h0(1:ed);heightdiff=fscanf(fid1,'%f',[4,gd]);heightdiff=heightdiff';k1=heightdiff(:,1);%起点k2=heightdiff(:,2);%终点k11=heightdiff(:,1);%起点k12=heightdiff(:,2);%终点h1=heightdiff(:,3);%高差s=heightdiff(:,4);%距离fclose('all');%点号转换[k1,k01]=chkdat(sd,pn,k1);[k2,k02]=chkdat(sd,pn,k2);h0(1:dd)=20000;ie=0;while(1)%计算近似高程for k=1:gdi=k1(k);j=k2(k);if(h0(i)<1e4&h0(j)>1e4)h0(j)=h0(i)+h1(k);ie=ie+1;endif(h0(i)>1e4&h0(j)<1e4)h0(i)=h0(j)-h1(k);ie=ie+1;endendif(ie==dd)break;endendh0=reshape(h0,length(h0),1); returnbm1函数(75页)function id=bm1(gd,dd,k1,k2)%计算一维压缩存放的数组idid=[];for i=1:ddk=i;for j=1:gdi1=k1(j);i2=k2(j);if(i1==i&i2<k)k=i2;endif(i2==i&i1<k)k=i1;endendid(i)=k;endfor i=2:ddid(i)=id(i-1)+i-id(i)+1;endreturn一维压缩存储法方程平差(76页)global pathname filenameglobal ed dd sd pn gd h0 k1 k2 h1 s dh;p=1./s;id=bm1(gd,dd,k1,k2);mm=id(dd);a(1:mm)=0;b(1:dd)=0;for k=1:gd %形成法方程i=k1(k);j=k2(k);h1=h1(k)+h0(i)-h0(j);if(i<=dd)ii=id(i)-i;a(ii+i)=a(ii+i)+p(k);b(i)=b(i)-h1*p(k);endif(j<=dd)jj=id(j)-j;a(jj+j)=a(jj+j)+p(k);b(j)=b(j)+h1*p(k);if(i<=dd)if(i>=j)a(ii+j)=a(ii+j)-p(k);elsea(jj+i)=a(jj+i)-p(k);endendendenda=gs5(dd,a,id);%变带宽下三角紧缩存储高斯消元法dh=cy6(a,b,id,dd,1);%常数项约化与回代子程序dh(dd+1:ed+dd)=0;hm(dd+1:ed+dd)=0;for i=1:sdh(i)=h0(i)+dh(i);endvv=0;for i=1:gdL(i)=h(k2(i))-h(k1(i));v(i)=h(k2(i))-h(k1(i))-h1(i);vv=vv+v(i)*v(i)/s(i);endu=sqrt(vv/(gd-dd));for i=1:ddb(1:dd)=0;b(i)=1.0;b=cy6(a,b,id,dd,i);hm(i)=sqrt(b(i))*u;endwritelevelnetdata(pn,k1,k2,h1,v',L',h0,dh',h',hm',u);gs5函数(77页)function a=gs5(dd,a,id)%变带宽高斯消去法for i=1:ddii=id(i)-i;if(i-1==0)li=1-ii;elseli=id(ii-1)-ii+1;endfor j=li:ijj=id(j)-j;if(j-1)==0lj=1-jj;elselj=id(j-1)-jj+1;endlk=li;if(li<lj)lk=lj;endfor k=lk:j-1kk=id(k);a(ii+j)=a(ii+j)-a(ii+k)/a(kk)*a(jj+k);endendendreturncy6函数(78页)function b=cy6(a,b,id,dd,k1)%常数项约化与回代子程序for i=k1:ddii=id(i)-i;if(i==1)nd=id(i);elsend=id(i)-id(i-1);ende=0;for k=1:i-1if((i-k)<nd)e=e+a(ii+k)*b(k);endendb(i)=(b(i)-e)/(a(ii+i);endfor i=dd-1:-1:k1ii=id(i);for k=i+1:ddkk=id(k)-k;nk=id(k)-id(k-1);if(k-i<nk)b(i)=b(i)-a(kk+i)/a(ii)*b(k);endendendreturn上三角存储法方程平差程序(79页)mm=(dd+1)*dd/2;a(1:mm)=0;b(1:dd)=0;for k=1:gdi=k1(k);j=k2(k);h1=h1(k)+h0(i)-h0(j);if(i<=dd)ii=(i-1)*(dd-i/2);a(ii+i)=a(ii+i)+1/s(k);b(i)=b(i)+1./s(k)*h1;endif(j<=dd)jj=(j-1)*(dd-j/2);a(jj+j)=a(jj+j)+1/s(k);b(j)=b(j)-1./s(k)*h1;if(i<=dd)if(i<j)a(ii+j)=a(ii+j)-1/s(k);elsea(jj+i)=a(jj+i)-1/s(k);endendendenda=invsqr(a,dd);for i=1:dddh(i)=0;di=(i-1)*(dd-i/2);for j=1:dddj=(j-1)*(dd-j/2);if(j<i)dh(i)=dh(i)-a(dj+i)*b(j);elsedh(i)=dh(i)-a(di+j)*b(i);endendenddh(dd+1:ed+dd)=0;hm(dd+1:ed+dd)=0;for i=1:sdh(i)=h0(i)+dh(i);endvv=0;for i=1:gdL(i)=h(k2(i))-h(k1(i));v(i)=h(k2(i))-h(k1(i))-h1(i);vv=vv+v(i)*v(i)/s(i);enduw0=sqrt(vv/(gd-dd));for i=1:ddii=(i-1)*(dd-i/2);hm(i)=sqrt(a(ii+i))*uw0;endreturn输出数据函数(79页)function writelevelnetdata(pn,k1,k2,h1,v,L,h0,dh,h,hm,uw0)disp('待定点高程平差值及中误差:')disp('---点号----近似高程(m)-高程改正(m)-高程平差值(m)-中误差')[pn,h0,dh,h,hm]disp('高差观测值平差值:')disp('---点号------点号----观测高差(m)---高差改正(m)-平差高差(m)')[pn(k1),pn(k2),h1,v,L][filename1,pathname1]=uigetfile('*.txt','请选择输出文件');fid2=fopen(strcat(pathname1,filename1),'wt');if(fid2==-1)msgbox('Error by Opening Output File','Warning','warn');return;endfprintf(fid2,'待定点高程平差值及中误差:\n 点号--近似高程(m)--高程改正(m)-高程平差值(m)-中误差\n');fprintf(fid2,'%5d %10.4f %10.4f %10.4f %10.4f\n',[pn,h0,dh,h,hm]');fprintf(fid2,'高差观测值平差值:\n -点号---点号--观测高差(m)--高差改正(m)-平差高差(m)\n'); fprintf(fid2,'%5d %5d %10.4f %10.4f %10.4f\n',[pn(k1),pn(k2),h1,v,L]');fprintf(fid2,'单位权中误差:%10.4fm\n',uw0);% open(strcat(pathname1,filename1));fclose(fid2);return利用Matlab矩阵运算的平差程序(81页)function level3ticdisp('平差已经开始---->>>>')global ed dd sd pn gd h0 k1 k2 h1 s dh;[ed,dd,sd,gd,pn,h0,k1,k2,h1,s]=readlevelnetdata;[dh,h,V,L,uw0,uwh,uwl]=calculatelevelnet(ed,dd,sd,gd,pn,h0,k1,k2,h1,s);writelevelnetdata(pn,k1,k2,h1,V,L,h0,dh,h,uwh,uw0); %输出水准网解算结果yunxing=toc;disp(['平差过程的运行时间为',num2str(yunxing),'秒。

《MATLAB_程序设计与应用》刘卫国高等教育出版社-第4章课后答案

《MATLAB_程序设计与应用》刘卫国高等教育出版社-第4章课后答案

第四章1.a=input('请输入一个4位数:');while (a<1000|a>9999)a=input('输入错误,请重新输入一个4位数:'); endb=fix(a/1000);c=rem(fix(a/100),10);d=rem(fix(a/10),10);e=rem(a,10);b=b+7;c=c+7;d=d+7;e=e+7;b=rem(b,10);c=rem(c,10);d=rem(c,10);e=rem(e,10);g=b;b=d;d=g;g=c;c=e;e=g;a=1000*b+100*c+10*d+e;disp(['加密后:',num2str(a)])2.逻辑表达式法:a=input('请输入a: ');b=input('请输入b: ');c=input('请输入c: ');x=0.5:1:5.5;x1=(x>=0.5&x<1.5);x2=(x>=1.5&x<3.5);x3=(x>=3.5&x<=5.5);y1=a.*(x.^2)+b.*x+c;y2=a*(sin(b)^c)+x;y3=log(abs(b+c./x));y=y1.*x1+y1.*x2+y3.*x3; disp(y)if语句法:a=input('请输入a: ');b=input('请输入b: ');c=input('请输入c: ');for x=0.5:1:5.5if x>=0.5 & x<1.5y=a.*(x.^2)+b.*x+celseif x>=1.5 & x<3.5y=a*(sin(b)^c)+xelseif x>=3.5 & x<5.5y=log(abs(b+c./x))endendswitch语句法:a=input('请输入a: ');b=input('请输入b: ');c=input('请输入c: ');for x=0.5:1:5.5switch floor(x/0.5)case {1,2}y=a.*(x.^2)+b.*x+c;case {3,4,5,6}y=a*(sin(b)^c)+x;case {7,8,9,10}y=log(abs(b+c./x)); enddisp(y)end3.x=fix(rand(1,20)*89)+10;x1=mean(x);n=find(rem(x,2)==0 & x<x1);disp(['小于平均数的偶数是:',num2str(x(n))]);4.(1)A=input('请输入20个数的一个行向量:');a=A(1);b=A(1);for m=Aif a>=ma=m;elseif b<=mb=m;endenddisp(['最小数是:',num2str(a)])disp(['最大数是:',num2str(b)])(2)A=input('请输入20个数的一个行向量:'); maxval=max(A)minval=min(A)5.s=0;for a=0:63c=2^a;s=s+c;enddisp(['2的0次方到63次方的和是:',num2str(s)])k=0:63n=2.^ks=sum(n)6.(1)sum1=0;for n=1:100x=(-1)^(n+1)*(1/n);sum1=sum1+x;enddisp(['当n取100时: sum=',num2str(sum1)])sum2=0;for n=1:1000x=(-1)^(n+1)*(1/n);sum2=sum2+x;enddisp(['当n取1000时: sum=',num2str(sum2)])sum3=0;for n=1:10000x=(-1)^(n+1)*(1/n);sum3=sum3+x;enddisp(['当n取10000时:sum=',num2str(sum3)])(2)sum1=0;n1=0;for n=1:2:100x=(-1)^n1*(1/n);sum1=sum1+x;n1=n1+1;enddisp(['当n取100时: sum=',num2str(sum1)])sum2=0;n2=0;for n=1:2:1000x=(-1)^n2*(1/n);sum2=sum2+x;n2=n2+1;enddisp(['当n取1000时: sum=',num2str(sum2)])sum3=0;n3=0;for n=1:2:10000x=(-1)^n3*(1/n);sum3=sum3+x;n3=n3+1;enddisp(['当n取10000时:sum=',num2str(sum3)])(3)sum1=0;for n=1:100x=1/(4^n);sum1=sum1+x;enddisp(['当n取100时: sum=',num2str(sum1)])sum2=0;for n=1:1000x=1/(4^n);sum2=sum2+x;enddisp(['当n取1000时: sum=',num2str(sum2)])sum3=0;for n=1:10000x=1/(4^n);sum3=sum3+x;enddisp(['当n取10000时:sum=',num2str(sum3)])(4)sum1=1;for n=1:100x=4*n*n/(2*n-1)/(2*n+1);sum1=sum1*x;enddisp(['当n取100时: sum=',num2str(sum1)])sum2=1;for n=1:1000x=4*n*n/(2*n-1)/(2*n+1);sum2=sum2*x;enddisp(['当n取1000时: sum=',num2str(sum2)])sum3=1;for n=1:10000x=4*n*n/(2*n-1)/(2*n+1);sum3=sum3*x;enddisp(['当n取10000时:sum=',num2str(sum3)])7.函数文件function f=fibnacci(n)if n==1 | n==2f=1;elsef=fibnacci(n-1)+fibnacci(n-2);end命令文件:shulie=[];for k=1:nshulie=[shulie fibnacci(k)];endshulie8.function [f1,f2]=juzhenji(x1,x2)f1=x1*x2;f2=x1.*x2;命令文件:clear alla=input('请输入一个矩阵:');b=input('请再输入一个矩阵:(注意:两矩阵要可以相乘)'); [f1,f2]=juzhenji(a,b);disp(f1)disp(f2)9.function sum=qiuhe(n,m)if n<=1sum=0;elsesum=n^m+qiuhe(n-1,m);end命令文件:clear ally=qiuhe(100,1)+qiuhe(50,2)+qiuhe(10,-1);disp(y)10.s=0;a=[12,13,14;15,16,17;18,19,20;21,22,23];for k=afor j=1:4if rem(k(j),2)~=0 s=s+k(j);endendendss =108(2)global xx=1:2:5;y=2:2:6;sub(y);xyfunction fun=sub(z) global xz=3*x;x=x+z;x =4 12 20 y =2 4 6。

MATLAB程序设计基础教程(刘国良)-第4章

MATLAB程序设计基础教程(刘国良)-第4章

函数

第4章 M脚本与M函数
2.脚本M文件 脚本文件也叫命令文件,是独立执行的文件,它不接受输 入参数,不返回任何值,而是代码的结合,该方法允许用户将 一系列MATLAB命令输入到一个简单的脚本“.m”文件中,只 要在MATLAB命令窗口中执行该文件,则会依次执行该文件中 的命令。 脚本M文件中包含一族由MATLAB语言所支持的语句,它类 似于DOS下的批处理文件,它的执行方式很简单,用户只需在 MATLAB 的提示符“>>”下键入该M文件的文件名,这样 MATLAB就会自动执行该M文件中的各条语句,并将结果直接返 回到MATLAB 的工作空间。
第4章 M脚本与M函数
3.块注释 在 MATLAB 5以前的版本中,注释是逐行进行的,采用百 分号(%)进行标记。逐行注释不利于用户增加和修改注释内容。 在MATLAB 5及以后的版本中,用户可以使用“%{”和“%}” 符号进行块注释,“%{”和“%}”分别代表注释块的起始和 结束。
第4章 M脚本与M函数
第4章 M脚本与M函数
在使用脚本文件时需要注意一点:如果当前工作区中存在 与该脚本同名的变量,则当输入该文件名时,系统将其作为变 量名执行。
MATLAB中有一个专门用于寻找“.m”文件的路径搜索器。 “.m”文件是以目录和文件夹的方式分布于文件系统中的,一 部分“.m”文件的目录是MATLAB的子目录,由于MATLAB的一 切操作都是在它的搜索路径,包括当前路径中进行的,因此如 果调用的函数在搜索路径之外,MATLAB就会认为此函数不存 在。
第4章 M脚本与M函数
4.1.2 M文件的建立、运行与命名规则 M文件的语法类似于一般高级语言,是一种程序化的编程
语言,但是与传统的高级语言相比,M文件又有其特点。它只 是一个简单的ASCII码型文本文件,因此,它的语法比一般的 高级语言要简单,程序也容易调试,并具有很好的交互性。

Matlab程序设计

Matlab程序设计
nargin %在函数体内获取实际输入变量个数 nargout %在函数体内获取实际输出变量个数 nargin(‘fun’) %在函数体外获取定义的输入参数个数 nargout(‘fun’) %在函数体外获取定义的输出参数个数
19
例:计算2个数的和,根据输入的参数个数不同使用不同 的运算表达式。 function [sum]=Ex0514(x,y) if nargin==1 sum=x+0; else if nargin==0 sum=0; else sum=x+y end end [sum]=Ex0514(1,2)
可以在某一目录中建立一个private目录来存放相关函数,具有性质:在 私有目录下的私有函数,只能被其父目录的M函数文件调用,对其他目 录的文件私有函数是不可见的,可以和其他目录下的函数重名;私有函 数父目录的M脚本文件也不可调用私有函数;在函数调用搜索时,私有 函数优先于其他MATALB路径上的函数。
局部变量和全局变量
(1)局部变量是在函数体内部使用的变量,其影响范围只 能在本函数内,仅存在于函数的工作空间内,只在函数执行 期间存在,函数执行完变量消失。
(2)全局变量是可以在不同函数工作空间和MATLAB工作 空间中共享使用的变量。在使用前必须用global定义,而且 每个要共享全局变量的函数和工作空间,都必须逐个用 global对变量加以定义。
m文件模式


m文件编辑器缺省设置是(通过菜单Preferences) c:\windows\notepad.exe 还可设成:c:\windows\write.exe c:\windows\command\ 注意:所创建的m文件必须纳入matlab搜索路 径后,才能在matlab命令窗口运行。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4.1.5 MATLAB程序设计举例

例2:要求按照考试成绩的等级输出百分制 分数段,试用开关结构编写程序。
g=input('please input grade:','s'); switch (g) case {'A','a'} disp('85~100'); case {'B','b'} disp('70~84'); case {'C','c'} disp('60~69'); case {'D','d'} disp('<60'); otherwise disp('输入错误!') end
运行结果: please input grade:a 85~100 please input grade:f 输入错误!
4.1.5 MATLAB程序设计举例

例3:用循环结构完成题目:设x的初始值为1.2, 迭代表达式 f ( x) x2 1 ,计算 f ( f ( f ... f ( x))) 共 10次复合,即 f 10 ( x) 的值。


(1)MATLAB用otherwise语句表示不符合 任何条件时默认执行,而C语言是用default 语句完成此功能。 (2)MATLAB执行完某case语句段后即自 动转出开关体而无需加break指令。而C语言 需要在下一个case语句前加break语句才能跳 出,否则要继续执行后面所有case的语句。
4.2 MATLAB函数的编写
引言


MATLAB下提供2种源程序文件格式。 一种是脚本文件。它的执行简单,用户只要在 MATLAB的提示符下输入该文件的文件名, MATLAB就会自动执行该M文件中的各条语句。 M文件只能对MATLAB工作空间中的数据进行处 理,文件中所有语句的执行结果也完全返回到工 作空间中。M文件格式适用于用户所需要立即得 到结果的小规模运算。 另一种即是M函数格式。除了输入和输出变量外, 其他在函数内部产生的所有变量都是局部变量, 只有在调试过程中可以查看,在函数调用结束后 这些变量均将消失。
tic; x = 0.01; for k = 1:10000 y(k) = log10(x); x = x + 0.01; end t1=toc tic; x = 0.01:0.01:100; y = log10(x); t2=toc %计时开始 %给x赋初值 %设定循环次数 %依次求y值 %x递增 %将程序运行时间赋给t1 %计数开始 %设定x所有值,以向量形式给出 %求出对应x的所有y,y为向量 %将程序运行时间赋给t2

4.1.4 try 和catch组成的试探结构

调用格式如下:
try 语句段1 catch 语句段2 end
该结构首先试探性地执行语句段1,如果在此段语句 执行过程中出现错误,则将错误信息赋给保留的lasterr变 量,并放弃这段语句的执行,转而执行catch后的语句段2。 当语句段2出现错误,则终止该结构。这一结构是C语言所 没有的,不过在C++、JAVA等语言中都具有这一结构。


4.1.3 循环结构 ——while语句循环结构
while 条件表达式 语句段 end while语句循环结构的条件表达式是一个逻 辑表达式。只要其值为真(非零),就将 自动执行语句段。一旦表达式为假就结束 循环。

4.1.3 循环结构 ——while语句循环结构

在以上的循环结构中可以加入break语句和continue 语句进行程序流程的控制。 Break 循环中断循环指令 ,并跳出本循环结构
4.1.4 try 和catch组成的试探结构 ——嵌套使用结构
try 语句段1 catch try 语句段2 catch 语句段3 end end
% 试探性地执行语句段1
% 尝试执行语句段2
% 捕获错误
4.1.4 try 和catch组成的试探结构 ——嵌套使用优点


1)提供了一种异常捕获机制,在catch语句 段捕获错误并说明错误的原因。 2)使程序更加可靠和高速运行。如将一段 不保险但速度快的算法放到try的语句段中, 而将一个保险的程序放到catch语句段中, 这样能保证原始问题的求解更加可靠,且 可能使程序高速运行。
4.1.1 if, else和elseif组成的条件转移结构 ——扩展的转移结构
扩展转移结构:
if 条件表达式1 语句段1 elseif 条件表达式2 语句段2 else 语句段3 end
流程为:如条件表达式1不满足,再判断elseif 的条件表达式2, 如果所有的条件均不满足,则执行else的语句段3。可以扩 展多个elseif 条件表达式及相应语句段。
a=[5 6 7 9 8]; index=input('请输入元素下标:'); try disp(int2str(a(index))); catch disp('下标不再范围内,请重新尝试。'); end
运行结果: 请输入元素下标:5 8 请输入元素下标:8 下标不再范围内,请重新尝试。
%设定一向量 %提示用户输入元素下标 %试探输出对应下标的元 素值 %如果输入不在向量范围 内,给出错误提示
运行结果: A= 8 1 6 3 5 7 4 9 2 ans = 15 15 15
%生成魔方矩阵 %生成一个3行1列矩阵空间 %给定循环表达式,循环次数为A 的列数,第一次取出A 的第一列赋给n,依次类推共3次 %将当前循环所取列与sum相加 %输出结果
4.1.5 MATLAB程序设计举例

例5:运行以下示例,比较循环和向量化编程的运 行效率。
其运行结果与for循环结果是一致的。不过,从程序可以看出,对这种已 知循环次数的情况,while循环比for循环要烦琐一些。
4.1.5 MATLAB程序设计举例

例4:以循环结构给出魔方矩阵各行的和。
%循环表达式为矩阵 A=magic(3) sum=zeros(3,1); for n=A sum=sum+n; end sum'

条件转移结构是一般结构化程序设计语言 都支持的最常见的程序结构。MATLAB下 有两种的转移结构。
4.1.1 if, else和elseif组成的条件转移结构 ——基本的转移结构

最基本的转移结构为:
if end 条件表达式 语句段
结构流程为: 如果满足条件表达式1,则执行语句段1; 否则跳过语句段1执行end之后的语句。

4.2 MATLAB函数的编写


4.2.1 MATLAB函数基本结构 4.2.2 MATLAB函数编写举例

4.3 MATLAB程序设计中的一些问题
4.1
MATLAB语言的流 程结构
引言

MATLAB提供了循环语句结构、条件语句 结构、开关语句结构以及类似于C++和 JAVA语言等面向对象语言的试探语句。
Continue 跳过此次循环到下一次循环 这2者的意义同C语言。


4.1.3 循环结构 ——注意事项

while与for不同:while语句循环结构循环次 数不确定;for语句循环结构确定
循环结构的执行速度较慢。所以在实际编 程时,如果能对整个矩阵进行运算时,尽 量不要采用循环结构而采取向量化编程 (Vectorization)以提高代码的执行效率。
运行结果: t1 = 0.4531 t2 = 0.0034
从以上不同运行时间来看,向量化编程对提高运行效率还是很明显的。注意,运 行时间随所用计算机配置的不同有所不同,但总的结果还应是向量化编程效率较 高。
4.1.5 MATLAB程序设计举例

例6:根据用户输入的下标值,以试探结构取出向 量中的对应元素值。
本节主要内容



4.1.1 4.1.2 构 4.1.3 4.1.4 4.1.5
if, else和elseif组成的条件转移结构 switch,case和otherwise组成的开关结 while, for循环结构 try 和catch组成的试探结构 MATLAB程序设计举例
4.1.1 if, else和elseif组成的条件转移结构
本章主要内容

第4章 MATLAB语言的程序设计

4.1 4.1.1 4.1.2 4.1.3 4.1.4 4.1.5
MATLAB语言的流程结构 if, else和elseif组成的条件转移结构 switch,case和otherwise组成的开关结构 循环结构 try 和catch组成的试探结构 MATLAB程序设计举例
4.1.2 switch,case和otherwise组成的开 关结构 ——注意事项

注意该结构中的开关表达式只能是标量或 字符串;case后面的表达式可以是标量、字 符串或单元数组。单元数组表示只要满足 这几个条件之一都去执行同一语句段。
4.1.2 switch,case和otherwise组成的开 关结构 ——与C语言的主while或for语句引导,用end结束, 这2个语句之间的部分称为循环体。
4.1.3 循环结构 ——for语句循环结构

for 循环变量 = v 语句段 end
v一般为行向量,循环变量每次从v向量中取一个数值,执 行一次循环体的内容,如此下去,直至执行完v向量中所 有的分量,将自动结束循环体的执行。循环次数即是v的 列数。 V的形式一般以快捷方式给出,形式多为或。也可以直接 给出向量具体值。v也可以是矩阵,这时每次的循环变量 值是当次的列向量。
4.1.2 switch,case和otherwise组成的开 关结构
相关文档
最新文档