收藏 分销(赏)

四Matlab语言程序设计基础.ppt

上传人:快乐****生活 文档编号:10509168 上传时间:2025-05-31 格式:PPT 页数:80 大小:409.50KB
下载 相关 举报
四Matlab语言程序设计基础.ppt_第1页
第1页 / 共80页
四Matlab语言程序设计基础.ppt_第2页
第2页 / 共80页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,.,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第四章 Matlab语言基础,matlab语言程序简洁、可读性很强而且调试十分容易。是matlab重要组成部分。,1,.,第四章 Matlab语言基础,4.1MATLAB数据结构,4.2 M文件简介,4.2.1 脚本文件,4.2.2函数文件,4.3 MATLAB的输入与输出语句,4.4,程序结构,4.5,程序的流程控制辅助语句,4.6程序文件的格式特征,4.7MATLAB搜索路径(文件管理),4.8MATLAB程序调试技巧,2,.,4.2 M文件简介,M文件是由MATLAB语句构成的ASCII码文件,用户可以用普通的文本编辑把一系列MATLAB语句写进一个文件里,给定文件名,确定文件的扩展名为.m,并存储,3,.,1.用MATLAB自带的编辑器edit,2.用文本文档编辑文件,M文件的编辑方法,4,.,1.,脚本文件,(Scripts):也称命令文件,是由用户为解决特定的问题而编制的.m文件;,2.,函数文件,(Function):子程序,可由用户编写,但它必须由其它m文件来调用,M文件分为两种:,5,.,脚本文件是最简单的m-文件,它没有入口和出口参数变量。可以自动执行一系列MATLAB命令等。,脚本是对工作空间中的现有数据进行操作,或创建一个新数据,而且脚本所创建的任一变量在脚本运行完都保留在工作空间中以便进一步使用。,4.2.1脚本文件,6,.,脚本文件举例,%例1:,tex1.m,-计算一个球的体积,r=input(radius:);,area=pi*r2;,volume=(4/3)*pi*r3;,fprintf(The volume of a sphere is%12.5fn,volume),写好上述程序后即可在指令视窗下键入,tex1,,即可执行已建立的,tex1.m,文件,7,.,4.2.2函数文件,函数,文件的第一行包含,function,功能,:,建立一个函数,可以同,MATLAB,的库函数一样使用。,8,.,1.函数M-文件的组成格式:,function,输出参数列表=函数名(形式参数列表),函数体语句;,注:,函数,m,文件的,文件名必须与其函数名相同,输出变量如果多于,1,个,则用方括号括起来;且用,逗号,隔开;当函数无输出参数时,输出参数项空缺或者用空的中括号表示,functionV,D=eig(A),语句体;,9,.,例1:建立函数文件求圆面积,function area,volume,=,circle_fun,(r),r为圆半径,%area 返回面积值,volume,返回体积值,area=pi*r2;,volume=(4/3)*pi*r3;,2.函数文件举例,10,.,保存为,circle_fun,.m函数M文件,r=5;%输入r值,area,volume,=,circle_fun,(r),调用函数,circle_fun,11,.,例2:编一个绘制图示波形的函数,在文本编辑窗口输入,function y=,tri,(t),%函数名tri,%t为横坐标,y为纵坐标,y=abs(t)=-1,12,.,调用函数,tri,,并画出它的波形,t=,-,2:0.05:2;%定义自变量,plot(t,tri,(t);axis(-1.5,1.5,-0.5,1.5),13,.,(1),函数定义行,(关键字function),functionout1,out2,.=filename(in1,in2,.),输入和输出(返回)的参数个数分别赋值给,nargin和nargout,两个MATLAB保留的变量,(2)第一行帮助行,以(%)开头,作为help指令显示的行,(3)函数体说明及有关注解,以(%)开头,用以说明函数的作用及有关内容,如果不希望显示某段信息,可在它的前面加空行,3.,函数,M-,文件的格式:包括,4,部分,14,.,(4)函数体语句,函数体内使用的除返回和输入变量这些在,function,语句中直接引用的变量以外的所有变量都是局部变量,即在该函数返回之后,这些变量会自动在,MATLAB,的工作空间中清除掉。,如果希望这些中间变量成为在整个程序中都起作用的变量,则可以将它们设置为全局变量(,global),。,15,.,4.,函数文件与脚本文件的主要区别,:(3,点,),由定义行,function,起头,后跟的函数名必须与文件名相同。,函数具有输入输出变量,可进行变量传递。,除非用,global,声明,函数文件中的变量均为局部变量,,不保存在工作空间中(即:程序在自己的工作空间中操作变量,与工作空间分开,无法访问),16,.,4.3 MATLAB的输入与输出语句,x=input(,请输入参数,x=);,2,a=input(,请输入矩阵,a=);,1,2;3,4;,s=,input(Please,input string s=);,通信,051-3%,输入,字符串,时注意加单引号,1.提示对话输入命令(input),17,.,name=,input(Input,your class name please:,s),%,s,代表字符串,(string),Input your class name please:,通信,06-1,%,此种情况,键入名字:通信,06-1,不用加,name=,通信,18,.,自由格式(,disp,)和格式化输出(,fprintf,)。,2.输出格式,x=2;,直接查看:,x,disp(x),ab%字符向量,ab,disp(ab),ab,格式控制输出(fprintf命令),fprintf(x=%.0f,y=%.5fn,pi,pi);,x=3,y=3.14159,19,.,temp=20;,disp(temp),disp(temp表示温度),disp(,num2str(temp),度C),20,temp表示温度,20度C,1)disp,直接输出文字或是一数值,举例:,disp显示指定变量的结果,而不显示变量名称,20,.,指令,fprintf,用来控制输出数据及文字的格式,其基本格式如,2)fprintf,格式输出,由%引导:,f:小数形式输出,e:指数形式输出,d:1位整数位形式输出:,1.234500e+001,21,.,fprintf,(The area is,%8.5f,n,area),在二个单引号间包括输出的字串,The area is,,,接着是输出数据的格式,%8.5f,,,再后来是换行符号以避免下一个输出数据或是提示符号也挤在同一行,最后键入要输出的数据名,area,。,例如,The area is 12.56637,%,输出值为,8,位数含,5,位小数,22,.,f_form:12345,fprintf(e_form:,%12.5e,n,12345.2),%输出值为,指数格式的12位数,,含5位小数,e_form:1.23452e+004,fprintf(e_form:,%d,n,12345.2),e_form:1.234520e+004,fprintf(f_form:,%12.0f,n,12345.2),%输出值为整数格式的12位数,以下的例子各说明了不同形态的输出格式,23,.,4.4,程序结构,与C语言类似,MATLAB程序的控制结构也有,顺序结构、选择结构和循环结构三种,,另外有一种,试探结构,其控制语句主要有if,while,for,switch四个,下面分别进行介绍。,24,.,if-else,语句,switch-case,语句,一、条件语句(选择结构语句),25,.,1.if条件语句,if 条件式,语句组,;,end,if 条件式1,语句组1,;elseif 条件式2,语句组,2;else,语句组,3;,end,%注意elseif中间无空格,26,.,例1:建立符号函数sign(x),x=input(x=);,if x0,sn=1;,elseif x=0,sn=0;,else,sn=-1;,end,fprintf(x=%.5f,sn=%.0fn,x,sn);,27,.,高频,低频,1209,1336,1447,1663,697,1,2,3,A,770,4,5,6,B,852,7,8,9,C,941,*,0,#,D,DTMF拨号音编解码的实现,28,.,29,.,switch,swith_expr,分支条件(结果为数值或字符串),case,case_expr1数值,(或字符串)常量表达式1,case,数值(或字与符串)常量表达式case_expr2,数值(或字符串)常量表达式case_expr3,case 数值(或字符串)常量表达式N,otherwise,End,格式,2.switch 分支结构,30,.,No=input(Please input your choice:0,1,2,3:);,switch No,case 0,disp(return to main menu);,case 1,disp(She is a girl);,case 2,disp(He is a boy);,otherwise,disp(I cant determine),end,例1.,变量做分支条件,31,.,例2:输入一个数,判断它是否能被5整除。,n=input(输入n);,switch,mod(n,5),case,0,fprintf(%d可被5整除,n),otherwise,fprintf(%d不能被5整除,n),end,函数做分支条件,32,.,例3:编写一个函数,将百分制的学生成绩转换为五级制的成绩(使用结构),Function f=TranGrade(x),switch,fix(x/10),case 10,9,f=A,case 8,f=B,case 7,f=C,case 6,f=D,otherwise,f=E,end,函数做分支条件,33,.,在switch语句中,switch是语句的开始,紧接着的是分支条件,分支条件可以是,一个变量、函数、或者表达式,。,不同的case可以定义不同的运算指令,而紧接在case后面的就是此case的分支条件,之后接着一个或一串运算指令。,若不符合所有的case条件,则程序就会执行otherwise下面的表达式。语句以end作为结束。,34,.,1)switch_expr的,结果必须是一个数值或者是一个字符串,。如果是一个数值(标量),switch_expr=case_exprN就被每一个case语句检测;如果是一个字符串,就用strcmp(switch_expr,case_exprN)进行检测。,2)在一个case语句后,可以拥有多个,常量表达式,其执行过程为首先计算选择表达式swith_expr的值,然后与各个case语句中的常量比较,然后选择第一个与之匹配的case语句组执行,执行完毕后立即退出switch语句组;若没有与选择表达式值相匹配的case语句,则执行othwise后的语句组,并退出switch语句组。,只执行第一个检验成功,符合条件的case语句,而跳过其他case运算,使用switch结构必须注意三点:,35,.,key=input(please input key valuve,09 or#or*:,s);,fl=0;,switch key,case 1,2,3,fl=697;,36,.,当开关表达式的值等于表达式,1,时,将执行语句段,1,,执行完语句段,1,后将转出开关体,,无需,像,c,语言那样在下一个,case,语句前加,break,语句,,,当需要在开关表达式满足若干个可以枚举的表达式之一时执行某一程序段,则,应该把这些表达式用,起来,中间,用逗号,分隔。,3)MATLAB开关switch语句与c的区别:,37,.,当前面枚举的各个表达式均不满足时,则将执行otherwise语句后面的语句段,此语句等价于c语言中的default语句。,在case语句引导的各个表达式中,不要用重复的表达式,否则列在后面的开关通路将永远也不能执行,程序的执行结果和各个case语句的次序无关,38,.,for 变量=表达式;end,while 条件式;end,for,语句多用在已知循环次数的情况,而,while,语句则多用在不能判定循环次数的情况下,只要条件式的值为1(真),就执行while与end之间的语句体,直到表达式的值为0(假)时终止该循环。,二、循环语句(for语句和while语句),39,.,例1:编写计算,s=1+2+3+100的MATLAB程序,s=0;,for,n=1:100,默认步长为1,s=s+n;,end,1.for循环语句举例,40,.,jiujiu=,1 0 0 0 0 0 0 0 0,2 4 0 0 0 0 0 0 0,3 6 9 0 0 0 0 0 0,4 8 12 16 0 0 0 0 0,5 10 15 20 25 0 0 0 0,6 12 18 24 30 36 0 0 0,7 14 21 28 35 42 49 0 0,8 16 24 32 40 48 56 64 0,9 18 27 36 45 54 63 72 81,clc,clear,jiujiu=zeros(9,9);,预分配数组空间,for i=1:9;,for j=1:i;,jiujiu(i,j)=i*j;,end,end,jiujiu,例2:设计九九,乘法,表,41,.,A=,1 1 1 1 1 1 1 1 1,2 2 2 2 2 2 2 2 2,3 3 3 3 3 3 3 3 3,4 4 4 4 4 4 4 4 4,5 5 5 5 5 5 5 5 5,6 6 6 6 6 6 6 6 6,7 7 7 7 7 7 7 7 7,8 8 8 8 8 8 8 8 8,9 9 9 9 9 9 9 9 9,B=,1 2 3 4 5 6 7 8 9,1 2 3 4 5 6 7 8 9,1 2 3 4 5 6 7 8 9,1 2 3 4 5 6 7 8 9,1 2 3 4 5 6 7 8 9,1 2 3 4 5 6 7 8 9,1 2 3 4 5 6 7 8 9,1 2 3 4 5 6 7 8 9,1 2 3 4 5 6 7 8 9,上机作业:用两矩阵点乘,如何实现九九表,42,.,上机作业:用两矩阵点乘,如何实现九九表,clc,clear,a=1:9;,A=repmat(a,1,9);,b=1:9;,B=repmat(b,9,1);,Jiujiu=tril(A.*B),jiujiu=,1 0 0 0 0 0 0 0 0,2 4 0 0 0 0 0 0 0,3 6 9 0 0 0 0 0 0,4 8 12 16 0 0 0 0 0,5 10 15 20 25 0 0 0 0,6 12 18 24 30 36 0 0 0,7 14 21 28 35 42 49 0 0,8 16 24 32 40 48 56 64 0,9 18 27 36 45 54 63 72 81,repmat(a,m,n),提示:,43,.,例3:求奇数和:s=1+3+5+(2n-1),n=input(请输入 n=);,s=0;,for i=1:2:n,%步长为2,s=s+i;,fprintf(i=%d,s=%dn,i,s);,%disp(i=,num2str(i),blanks(6),s=,num2str(s),end,s%disp(s),注意使用提示输入与输出语句,44,.,For循环语句的执行过程:,从矩阵的第一列开始,依次将矩阵的各列之值赋值给变量,然后执行语句组中的语句,直到最后一列,for x=array,commands;end,注意:当循环变量为矩阵时,45,.,clc,clear,data=3 9 45 6;7 16 -1 5;,y=zeros(1,4);,k=1;,for,n=data,%循环变量为一矩阵,%,每执行一次循环n得到data的一列2个值,y(k)=n(1)-n(2);,k=k+1;,end,y,例,4,:求,data,的差分(按列求差),y=,-4 -7 46 1,46,.,2.while循环结构举例,例1:求1100的偶数和,x=0;,sum=0;,while x101,sum=sum+x;,x=x+2;,end,sum,47,.,for 变量=表达式;end,while 条件式;end,clear,x=,zeros,(1,6);,for I=1:6;,x(I)=1/I;,end,format rat;,I,x,x=,zeros,(1,6);,I=1;,while I7,x(I)=1/I;,I=I+1,;,end,format rat;,I,x,两循环比较,结果:x=1 1/2 1/3 1/4 1/5 1/6,I=6,I=7,48,.,x=zeros(1,6);,for I=1:6;,x(I)=1/I;,I=100;,end,format rat;,I,x,在循环体内重新赋值I,能否结束循环?,思考,49,.,n=1:10;,x=sin(n*pi/10),for n=1:10,x=sin(n*pi/10),end,两种方法得出同样的结果,而后者执行更快,更直观,要求较少的输入。,若能用一个等效的数组方法来解给定的问题时,,应避免用,for,循环,50,.,data=3 9 45 6;7 16 -1 5;,y=zeros(1,4);,k=1;,for n=data,每执行一次循环n得到data的1列2个值,y(k)=n(1)-n(2);,k=k+1;,end,y,data=,3 9 45 6,7 16 -1 5,y=,-4 -7 46 1,for,循环,(While,循环,),被执行之前,应预置空间,51,.,for循环的其它方面重要提示,不能用,for,循环内重新赋值循环变量的方法来终止循环。,若能用一个等效的矩阵来解给定的问题时,应避免用,for,循环,。,为了得到最大的速度,在,for,循环,(While,循环,),被执行之前,,应预先使用,zeros,预置空间,52,.,continue,命令,中断语句:,break;,暂停语句,:,pause,键盘控制语句:,keyboard,常用于函数文件的调试,(,可随时查看变量,),4.5,程序的流程控制辅助语句,53,.,例1:a=3;b=6;,for i=1:3,b=b+1,if i2,continue,end,a=a+2,end,输出:b=7,b=8,a=5,b=9,a=7,例2:a=3;,b=6;,for i=1:3,b=b+1,if i下输入return就可以了,56,.,%exp2_8.m,clc,clear,a=4;b=6;,disp(暂停,请按任意键继续),pause,%暂停,直到用户按任意键,c=a9+b7;,keyboard,%暂时把控制权交给键盘(在命令窗口中出现k提示符k),%输入return,回车后退出,继续执行下面的语句。,pause,命令及keyboard举例,57,.,pause,命令举例,58,.,4.6程序文件的格式特征,(1)用clc、clear、close all等语句开始,清除掉工作空间中原有的变量和图形,以避免其他已执行的程序残留数据对本程序的影响。,(2)前几行通常是对此程序用途的说明,特别是在运行时对用户输入数据的要求,更要叙述清楚。这些注释行必须以%号开始.,(3)在自设变量名时要防止与MATLAB中的函数重名,59,.,(4)程序中必须都用半角英文字母和符号(只有引号括住的和%号后的内容可用汉字),(5)文件名不允许用汉字,因为这个文件名,也就是MATLAB的调用命令,它不认汉字。,(6)函数M文件必须以function开始,(7),可运行的MATLAB程序中可调入但不能包含一个M函数文件,(8)一个函数M文件被调用时,可直接调用函数名如y=myfun(),而不传参数值,60,.,function Base_info=Base(),B=randn(3,3);,Base_in=9,8,7;6,5,4;3,2,1;,Base_info=Base_in+B;,一个函数,M,文件被调用时,可直接调用函数名如,Base_info,=Base(),Base_info,=Base(),本身不需传参数,调用函数可不传参数情况一:,61,.,固有变量nargin、nargout的利用,调用函数可不传参数情况二:,62,.,当调用一个函数时,所用的输入和输出的参量的数目,在函数内是规定好的。函数工作空间变量,nargin,包含输入参量个数;函数工作空间变量,nargout,包含输出参量个数。,事实上,这些变量常用来设置缺省输入变量,并决定用户所希望的输出变量,函数输入输出参数,nargin、nargout,63,.,例:编写一函数,要求完成两个功能,一是设置,缺省,输入变量值a=2,b=3;二是返回x和y的值,其中x是第一个形参的平方,y是两个形参的和,function x,y=myfun(a,b),if nargin1,a=2;b=3;,end,if nargin2,b=3;,end,x=a.2;y=a+b;,一个函数,M,文件被调用时,可直接调用函数名如,y=,myfun,(),而不传参数值,64,.,4.7MATLAB搜索路径(文件管理),搜索路径:标识符(包括,变量,内部函数,用户自定义函数,等等)识别的顺序,它按如下的顺序(优先级)与已有的记录相比较:,工作空间的变量名,内部固有变量名,mex 文件名,M文件名,65,.,例如:,在MATLAB提示符下键入,lust,则 MATLAB按以下步骤处理.,(1)首先检查lust是不是,变量,;,(2)然后检查lust是不是,内部函数,;,(3)检查当前目录中是否有lust.,mex,lust.,dll,或lust.,m,文件,(4)如果均不满足,则显示出错信息.,66,.,如果两个名字相同,它只认优先级高的名字,比如用户在工作空间中给,i,赋了值,那么系统就不会取内部固有变量中设定的虚数,i,;,如果用户在程序中设立了一个与MATLAB中的函数同名的变量,则每次调用此名字时,出现的将是用户自定的变量,调不出MATLAB中的函数。所以,在自设变量名时要防止与MATLAB中的函数重名,67,.,function Base_info=Base(),B=randn(3,3);,Base_in=9,8,7;6,5,4;3,2,1;,Base_info=Base_in+B;,又设变量:Base=9,8,7;6,5,4;3,2,1;,调用函数Base_info=Base()时,将出现与我们所要的结果不一致的现象,设有函数:,68,.,把某些,分号改为逗号,,使中间结果能显示在屏幕上,作为查错的依据。,在,子程序中适当部位加keyboard命令,。此时,系统会暂停而等待用户键入命令。这时子程序中的变量还存在于工作空间中,可以对它们进行检查。,将,函数文件,的第一行前加%号,使它成为程序文件,进行初步调试。第一行中的输入变元,可改用input 或赋值语句来输入,调好后再改回函数文件。,4.8MATLAB,程序调试常用方法,69,.,Debug程序调试设断点,在运行含有断点的程序后,,可将鼠,标放在变量旁查看变量的信息,在程序调试过程中很有用,70,.,A(2 3 6 5 4 1)=9 8 7 6 5 4,A=,4 9 8 5 6 7,71,.,方法一:利用随机数产生函数alpha=randperm(data_length),实现交织。,说明:,data1 1 1 0 1;,data_length5;,alpha=randperm(data_length);,%输出alpha为随机生成的5个数,若alpha5 3 1 2 4,可认为是索引号,实验3.2,data_inter=data(alpha);,%随机交织后的输出帧为data_inter=1 1 1 1 0,即data的第5位是data_inter的%第1位,依次类推。,72,.,方法二:仿照方法一,编写函数,alpha2=lincol_inter(data_length),,%使之产生按行读入,按列读出的序号;再利用,%data_inter=data(alpha2)完成一帧数据的交织。,73,.,Data_in=randint(1,Len_B);,%产生等概分布的0,1随机序列,alpha=,randperm,(size(Data_in,2);,InterCode=Data_in(alpha);,%输出交织后的编码序列,1.发送端的随机交织,2.接收端的随机解交织,function Data_derandperm=,derandperm,(Data_in,alpha),%,alpha为发送端产生的交织序列号,Data_derandperm(alpha)=Data_in;,%输出交织后的编码序列,74,.,4.试编写一函数,使之具有如下功能:将随机产生的二进制序列按每2位(00:0,01:1,10:2,11:3)、3位或4位二进制位与十进制相对应的关系转变成相应十进制数序列。,function NumTrans=fun_bin2dec(Xframe,COdelen),%Xframe随机产生的二进制序列,%COdelen表示码长2、3、4等,%NumTrans返回转变后的十进制序列,Xlen=length(Xframe);%二进制信号序列长度,NumTrans=zeros(1,Xlen/COdelen);%生成一行向量放转变成十进制的数,75,.,MapCode=0+0j,awgn_info=awgn(MapCode,SNRdb(am),measured),BaseSignal_filter=filter(Multipath,1,awgn_info);%信号加多径,用滤波实现,76,.,MapCode=0+0j,Multipath=1 0 0 0 0 0.707;%有延迟5个码片的多径信号,awgn_info=awgn(MapCode,SNRdb(am),measured),BaseSignal_filter=filter(Multipath,1,awgn_info);%信号加多径,用滤波实现,77,.,78,.,Thank you for your cooperation,79,.,谢谢观看!,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服