收藏 分销(赏)

MATLAB编程基础.ppt

上传人:二*** 文档编号:12707995 上传时间:2025-12-01 格式:PPT 页数:121 大小:868KB 下载积分:5 金币
下载 相关 举报
MATLAB编程基础.ppt_第1页
第1页 / 共121页
本文档共121页,全文阅读请下载到手机保存,查看更方便
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,MATLAB,编程基础,流 程 控 制,1,选择结构,如前所述,当人们判断某一条件是否满足,根据判断的结果来选择不同的解决问题的方法时,就需要使用选择结构。和,C,语言类似,,MATLAB,的条件判断可以使用,if,语句或者,switch,语句。,1.1 if,语句,if,语句的基本语法结构有三种,分别如下:,(1)if(,关系运算表达式,),MATLAB,语句,end,这种形式的选择结构表示,当关系运算表达式计算的结果为逻辑真的时候,执行,MATLAB,语句,这里的,MATLAB,语句可以是一个,MATLAB,表达式,也可以是多个,MATLAB,表达式。在,MATLAB,语句的结尾处,必须有关键字,end,。,(2)if(,关系运算表达式,),MATLAB,语句,A,else,MATLAB,语句,B,end,这种选择结构表示,当关系运算表达式的计算结果为逻辑真的时候,执行,MATLAB,语句,A,,,否则执行,MATLAB,语句,B,,,在语句,B,的结尾必须具有关键字,end,。,(3)if(,关系运算表达式,a),MATLAB,语句,A,elseif,(,关系运算表达式,b),MATLAB,语句,B,else(,关系运算表达式,c),end,这种选择结构可以判断多条关系运算表达式的计算结果,然后按照执行的逻辑关系执行相应的语句。根据类似的,C,语言知识或者前面两种选择结构的介绍判断这种结构的执行方式。,if(,关系表达式,a),if(,关系表达式,b)MATLAB,语句,A,else MATLAB,语句,B,end,else,if(,关系表达式,c)MATLAB,语句,C,else MATLAB,语句,D,end,end,注意:,在使用嵌套的选择结构时,需要小心,if,语句和,end,关键字的配对。,和,C,语言类似,,if-,elseif,-else,的语句结构也可以嵌套地使用,也就是可以存在这样的语句结构:,1.2 switch,语句,另外一种构成选择结构的关键字就是,switch,。,在处理实际问题的时候,往往要处理多个分支,这时如果使用,if-else,语句处理多分支结构往往使程序变得十分冗长,从而降低了程序的可读性。,switch,语句就可以用于处理这种多分支的选择,它的基本语法结构如下:,switch(,表达式,),case,常量表达式,a,:,MATLAB,语句,A,case,常量表达式,b,:,MATLAB,语句,B,case,常量表达式,m,:,MATLAB,语句,M,otherwise,:,MATLAB,语句,N,end,在,switch,语句之后的表达式可以是一个数值类型表达式或者是一个数值类型的变量,当这个表达式的值同,case,后面的某一个常量表达式相等时,则执行该,case,后面的常量表达式后面的语句。,注意:,MATLAB,的,switch,和,C,语言的,switch,语句结构不同。在,C,语言中,每一个,case,后面的语句中必须包含类似,break,语句的流程控制语句,否则程序会依次执行符合条件的,case,语句后面的每一个,case,分支。但是在,MATLAB,中就不必如此,程序仅仅执行符合条件的,case,分支。,补充例题,3,中需要用户在执行程序的过程中输入一个字符串,,switch,语句根据用户的输入判断执行相应的,case,分支。若没有符合条件的,case,分支,则,switch,执行,otherwise,后面的语句。若,switch,结构中没有定义,otherwise,及其相应的代码,则程序不会进行任何操作,而是直接退出,switch,结构。,提示:,在处理以字符串变量或者常量参与的关系判断操作时,使用,switch,结构要比,if-else,结构效率高一些。,由于,MATLAB,的,switch,结构没有,C,语言的,fall-through,特性,所以,如果需要针对多个条件而使用同一个,case,分支的时候,需要使用元胞数组与之配合。,例子,4switch,结构使用示例,switch_examp2.m,。,001clear all,002,003,var,=input(Input a,Numer,:);,004switch,var,005 case 1,006 disp(1),007 case 2,3,4,008 disp(2 or 3 or 4),009 case 5,010 disp(5),011 otherwise,012,disp(something,else),013end,例子,4,运行的方法和效果如下:,switch_examp2,Input a Numer:1,1,switch_examp2,Input a Numer:3,2 or 3 or 4,switch_examp2,Input a Numer:7,something else,例子,4,代码的核心部分为,007,行,这里使用元胞数组增加判断条件的个数,当输入的数字为,2,、,3,或者,4,时,,switch,结构将使用同一个,case,分支进行判断、计算。,注意:,从代码的完整性和可靠性角度出发,在使用,switch,语句时,一定要包含,otherwise,分支,这是一种良好的编程习惯。,2,循环结构,在解决很多问题的时候需要使用循环结构,例如求解数列的和或者进行某种迭代法求解数值方程时,都需要循环结构配合完成计算。,在,MATLAB,中,包含两种循环结构,一种是循环次数不确定的,while,循环,而另一种是循环次数确定的,for,循环。,1,while,循环结构,while,语句可以用来实现“当”型的循环结构,它的一般形式如下:,while(,表达式,),MATLAB,语句,end,当表达式为真时,循环将执行由语句构成的循环体,其特点是先判断循环条件,如果循环条件成立,即表达式运算结果为“真”,再执行循环体。循环体执行的语句可以是一句也可以是多句,在,MATLAB,语句之后必须使用关键字,end,作为整个循环结构的结束。另外,在循环过程中一定要能够改变关系表达式或者布尔类型变量的值,或者使用其他方法来跳出循环,否则会陷入死循环,(,无法正常退出的循环叫作死循环,),。,例子,5,使用,while,语句求解。,001i=1;,002sum=0;,003while(i while_example,计算结果为:,500500,例子,5,的使用了,while,循环结构,在循环结构中进行了累加的操作。需要注意的是,在,MATLAB,中没有类似,C,语言的,+,或者,+=,等运算操作符,因此在进行诸如累加或者递减的运算时,不得不给出完整的表达式。另外,例子,5,求数列和的算法的运算效率很低,在,MATLAB,中不要使用这样的结构完成类似的运算,而需要采用向量化的计算。,注意:,while,循环结构的关系表达式可以是某个数据变量或者常量,这时,将按照非零值为逻辑真进行相应的操作。另外,在进行上述操作时,若数据变量为空矩阵,则,while,语句将空矩阵作为逻辑假处理,也就是说,在,while A MATLAB,语句,S1 end,结构中,若,A,为空矩阵,则,MATLAB,语句,S1,永远不会被执行。,2,for,循环结构,使用,for,语句构成循环是最灵活、简便的方法,不过,使用,for,语句循环需要预先知道循环体执行的次数,所以这种循环一般叫作确定循环。在,MATLAB,中,for,循环的基本结构如下:,for index=start:increment:end,MATLAB,语句,end,其中,,index,的取值取决于,start,和,end,的值,一般地,这里通常使用等差的数列向量,参见例子,6,。,例子,6,使用,for,语句求解 。,001sum=0;,002for i=1:1000,003 sum=sum+i;,004end,005,str,=,计算结果为:,num2str(sum);,006,disp(str,),例子,6,运行的结果为,for_example,计算结果为:,500500,在例子,6,中,使用了确定次数的,for,循环结构,循环次数使用行向量进行控制,而且索引值,i,按照默认的数值,1,进行递增。,在,for,循环语句中,不仅可以使用行向量进行循环迭代的处理,也可以使用矩阵作为循环次数的控制变量,这时循环的索引值将直接使用矩阵的每一列,循环的次数为矩阵的列数,参见例子,7,。,例子,7,for,循环示例。,001A=rand(3,4);,002,003for i=A,004 sum=mean(i),005end,例子,7,运行的结果为,for_matrices,sum=,0.2728,sum=,0.6649,sum=,0.4275,sum=,0.5220,例子,7,尽管只有短短的几行,但是使用了一个矩阵作为循环的索引值,于是,循环结果就分别计算矩阵的每一列元素的均值。,和其他高级语言类似,,MATLAB,的循环结构也可以进行嵌套使用,使用嵌套的循环需要注意,for,关键字和,end,关键字之间的配对使用,根据高级语言的一般特性来推断其运行的方式。,3 break,语句和,continue,语句,在循环结构中还有两条语句会影响程序的流程,这就是,break,语句和,continue,语句,这两条语句的基本功能如下:,当,break,语句使用在循环体中的时候,其作用是能够在执行循环体的时候强迫终止循环,即控制程序的流程,使其提前退出循环,它的使用方法是,break,;,continue,语句出现在循环体中的时候,其作用是能够中断本次的循环体运行,将程序的流程跳转到判断循环条件的语句处,继续下一次的循环,它的使用方法是,continue,;,例子,8,break,语句示例,break_example.m,。,001i=0;,002j=0;,003k=0;,004for i=1:2,005 for j=1:2,006 for k=1:2,007 if(k=2),008,disp,(,退出循环,);,009 break;,010 end,011,str,=,sprintf(I,=%d,J=%d,K=%d,i,j,k);,012,disp(str,);,013 end,014 end,015end,016,disp,(,程序运行结束,);,例子,8,的运行结果如下:,break_example,I=1,J=1,K=1,退出循环,I=1,J=2,K=1,退出循环,I=2,J=1,K=1,退出循环,I=2,J=2,K=1,退出循环,程序运行结束,break,语句的作用是退出当前的循环结构运行,所以在例子,8,中,位于最内层循环的,break,语句执行的结果是退出了最内层的循环,k,,,位于外层的循环,i,和,j,还是都运行完,毕了。,例子,9,continue,语句示例。,001i=0;,002for i=1:6,003 if(i3),004 continue,005 else,006,str,=,sprintf(I,=%d,i);,007,disp(str,);,008 end,009end,010,str,=,sprintf,(,循环结束,I=%d,i);,011,disp(str,);,例子,9,的运行结果如下:,continue_example,I=1,I=2,I=3,循环结束,I=6,continue,语句的作用在例子,9,中得到了充分说明,该语句终止当前的循环,然后继续下一次循环运算,直到所有的循环迭代运算结束为止。,4,提高运算性能,M,语言和其他的高级语言不同,由于采用了解释型语言,所以,M,语言的执行效率肯定低于编译型语言,(,例如,C,语言,),。然而,随着,MATLAB,版本的不断升级,再加之合理利用,MATLAB,向量运算等特点可以较大幅度地提高,M,语言代码的执行效率。在本小节结合一些具体的例子来讲述,M,语言编程以及,MATLAB,软件本身在提高程序执行效率方面的一些,特性。,1,向量化运算,首先,希望读者牢记这样一点,,MATLAB,最初的目的是提供便利的矩阵数据操作能力。所以在大多数的应用程序中,不要使用循环结构操作矩阵的元素,应直接使用矩阵元素的索引或者矩阵运算的函数,这样做不仅能够提高代码的执行效率,而且还能够提高程序的可读性,这就是所谓的向量化的运算,也就是说,尽量将使用,while,循环或者,for,循环的语句结构转换成等价的向量或者矩阵运算,以提高程序的运算速度,参见例子,10,。,例子,10,向量化运算,array_vs_loops.m,。,001Mass=rand(5,10000);,002Length=rand(5,10000);,003Width=rand(5,10000);,004Height=rand(5,10000);,005,006rows,cols=size(Mass);,007,008disp(char(10),使用数组运算:,),009tic,010Density=Mass./(Length.*Width.*Height);,011,toc,012,013disp(char(10),使用循环结构:,),014tic;,015for I=1:rows,016 for J=1:cols,017 Density(I)=Mass(I,J)/(Length(I,J)*Width(I,J)*Height(I,J);,018 end,019end,020,toc,例子,10,比较了循环结构和数组运算的执行效率,程序中分别在,010,行使用数组运算和在,015,019,行使用循环结构完成了同样的工作。程序的运行结果如下:,array_vs_loops,使用数组运算:,elapsed_time=,*,使用循环结构:,elapsed_time=,*,2,预分配存储空间,另外一种能够提高运算效率的方法就是进行内存变量存储空间的预分配,首先察看例子,11,。,例子,11,内存预分配的例子,pre_allocate.m,。,001disp(char(10),使用内存预分配:,),002,pre_allo,=zeros(10000,1);,003tic;,004for I=1:10000,005,pre_allo(I,)=rand(1);,006end,007,toc,008,009disp(char(10),不使用内存预分配:,),010tic;,011for J=1:10000,012,not_pre_allo(J,)=rand(1);,013end,014,toc,例子,11,的执行结果如下:,pre_allocate,使用内存预分配:,elapsed_time=,*,不使用内存预分配,:,elapsed_time=,*,上面两种不同的运算惟一的区别就是程序,002,行,执行这行语句之后,,MATLAB,自动分配了,10 000,个连续的内存空间用于存储数据,,MATLAB,将一次创建足够的存储空间,然后依次赋值。而后者,not_pre_alloc,变量没有进行相应的操作,所以带来了两次运算结果的不同。,在不使用内存预分配的运算中,,MATLAB,是如何进行操作的呢?,当,I=1,时,,MATLAB,将使用一小块长度为一个单元大小的内存保存一位随机数。,当,I=2,时,,MATLAB,寻找一块两单元大小的内存区,一个单元放第一个随机数,第二个放另外一个随机数。,当,I=10000,时,,MATLAB,寻找一块容纳,10000,单元的内存区存放以前的,9999,个随机数,同时把最新的一个随机数加入进去。代码运行的结果造成了存储空间的浪费,降低了程序的执行速度。,所以,在编写,M,语言程序的时候需要尽量使用内存的预分配,而少使用或者不使用数组内存空间的自动扩充方式。,MATLAB,针对不同的数据类型有不同的内存预分配函数,见表,1,。,表,1,内存预分配函数,表,1,中说明了不同数据类型所要使用的内存预分配函数,其中结构类型的数组需要两个函数配合使用,利用,struct,函数构造结构,而使用,repmat,函数创建数组。,对于非双精度类型的数据,例如整数类型或者单精度类型,进行内存的预分配时,需要使用相应的构造函数或者类型转换函数,例如:,Y=int16(zeros(1:10000);,在上面的表达式中创建了连续的,10 000,个,16,位整数的存储空间。,当预先分配的内存空间无法容纳数据时,则可以通过,repmat,函数来扩充数组的存储,空间。,3,MATLAB,加速器,尽管利用了上述的特性可以明显提高,M,语言的运行效率,但是在同等条件下,,M,语言的效率还是无法和第四代高级编程语言的执行效率相媲美,于是,在,MATLAB 6.5,版本中,新增加了,MATLAB,性能加速器这样一个新特性。,MATLAB,性能加速器能够明显改善循环结构、内建函数调用等方面的运行效率,特别是在处理循环迭代次数确定的,for,循环结构中,其运算速度较早期的,MATLAB,版本有很大的提高,在表,2,中总结了,MATLAB,加速器能够发挥作用的,M,语言元素。,表,2,加速器能够影响的,M,语言元素,表,3,性能加速器不起作用的,M,语言元素,3,脚 本 文 件,脚本文件是最简单的一种,M,语言文件,在本章前面章节的例子中都使用了脚本文件。所谓脚本文件,就是由一系列的,MATLAB,指令和命令组成的纯文本格式的,M,文件,执行脚本文件时,文件中的指令或者命令按照出现在脚本文件中的顺序依次执行。脚本文件没有输入参数,也没有输出参数,执行起来就像早期的,DOS,操作系统的批处理文件一样,而脚本文件处理的数据或者变量必须在,MATLAB,的公共工作空间中。,例子,12,脚本文件示例。,001%,注释行,002%M,脚本文件示例,003%flower petal,004%,以下为代码行,005%,计算,006theta=-pi:0.01:pi;,007rho(1,:)=2*sin(5*theta).2;,008rho(2,:)=cos(10*theta).3;,009rho(3,:)=sin(theta).2;,010rho(4,:)=5*cos(3.5*theta).3;,011 for k=1:4,012%,图形输出,013 subplot(2,2,k),014,polar(theta,rho(k,:),015end,016,disp,(,程序运行结束,!),在,MATLAB,命令行中运行该脚本文件:,script_example,程序运行结束,!,图,2,例子,12,脚本文件的运行结果,仔细察看例子,12,的脚本文件,在脚本文件中,主要由注释行和代码行组成。,M,文件的注释行需要使用,%,定义符,在,%,之后的所有文本都认为是注释文本,不过,,M,文件的注释定义符仅能影响一行代码,类似于,C+,语言中的“,/”,。然而在,M,语言中,没有类似,C,语言的注释定义符“,/*”,和“*,/”,,所以无法一次定义多行注释。给程序添加适当的注释是良好的编程习惯,希望读者能够在日常编程中多多使用。,脚本文件中的代码行都是一些简单的,MATLAB,指令或者命令,这些命令可以用来完成相应的计算处理数据、绘制图形结果的操作,也可以在脚本文件中调用其他的函数完成复杂的数学运算,在例子,12,中就完成了这些工作。另外,在,MATLAB,中还有一些指令用来处理程序和用户之间的交互,在表,4-4,中进行了总结。,表,4,脚本文件中常用的,MATLAB,指令,MATLAB,一般使用脚本文件作为某种批处理文件,其中,有两个批处理文件经常被,MATLAB,自动调用,这两个脚本文件分别为,startup.m,和,finish.m,。,startup.m,文件在,MATLAB,启动时自动被执行,用户可以自己创建并定义编写该文件,例如在文件中添加物理常量的定义、系统变量的设置或者,MATLAB,搜索路径的设置。当用户安装,MATLAB,之后,在,toolboxlocal,路径下有一个,M,文件,名为,Starupsav.m,,,该文件可以看作是,startup.m,文件的模板,可以修改该文件,然后将其以文件名,startup.m,的形式保存在,toolboxlocal,路径下。,与,startup.m,文件相对应的是,finish.m,文件,该文件在,MATLAB,退出时自动执行,用户可以自己创建并定义编写该文件,例如在文件中添加保存数据等指令,这样可以将每次退出前的工作结果进行保留。同样,在,toolboxlocal,路径下有两个文件,分别为,finishsav.m,和,finishdlg.m,,,这两个文件可以用来作为,finish.m,文件的模板,相关的具体内容介绍请读者自己察看相应的文件和帮助文档。,4,函 数 文 件,4.1,基本结构,M,函数文件和脚本文件不同,函数文件不仅有自己特殊的文件格式,不同的函数还分别具有自己的工作空间。同其他高级语言类似,,M,函数文件也有局部变量和全局变量。读者首先需要了解的是函数文件的基本结构,参见例子,13,。,例子,13,函数文件示例,average.m,。,001function y=average(x),002%AVERAGE,求向量元素的均值,003%,语法:,004%Y=average(X),005%,其中,,X,是向量,Y,为计算得到向量元素的均值,006%,若输入参数为非向量则出错,007,008%,代码行,009m,n=size(x);,010%,判断输入参数是否为向量,011if(m=1)|(n=1)|(m=1&n=1),012%,若输入参数不是向量,则出错,013 error(Input must be a vector),014end,015%,计算向量元素的均值,016y=sum(x)/length(x);,在,MATLAB,命令行中,键入下面的指令运行例子,13,的代码:,z=1:99;,y=average(z),y=,50,M,语言函数文件具有下面的不同部分:,*函数定义行。,*在线帮助。,*注释行。,*,M,语言代码。,下面结合例子,13,分别说明这些部分的构成。,函数定义行,例子,13,的函数定义行为代码的,001,行:,001function y=average(x),这一行代码中包括关键字,function,、,函数输出参数,y,、,函数的名称,average,和函数的输入参数,x,。,需要读者注意的是函数的名称,函数的名称定义要求必须以字符开头,后面可以用字符、数字和下划线的组合构成函数名称。,MATLAB,对函数名称的长度有限定,读者可以在自己的,MATLAB,中,通过执行,namelengthmax,函数获取相应的数值。假设该函数返回的数值为,N,,,若函数的名称长度超过了,N,,则,MATLAB,使用函数名称的前,N,个字符作为函数名称。,一般推荐将函数名称用小写的英文字符表示,同时函数的,M,文件名称最好和函数名称保持一致,若文件名称和函数名称不一致,则调用函数的时候需要使用文件名称而非函数名称。,M,函数文件的在线帮助为紧随在函数定义行的注释行。在例子,13,中,,average,函数的在线帮助为,002,006,行的注释行。若在,MATLAB,命令行中键入下面的指令:,help average,在,MATLAB,的命令窗口中就会出现:,AVERAGE,求向量元素的均值,语法:,Y=average(X),其中,,X,是向量,,Y,为计算得到向量元素的均值,若输入参数为非向量则出错,其中,在线帮助中比较重要而且特殊的是在线帮助的第一行,在,MATLAB,中将这行注释称为,H1,帮助行,它是在线帮助的第一行,若使用,lookfor,函数查询函数时,仅查询并显示函数的,H1,帮助行,例如,在,MATLAB,命令行中键入下面的指令:,lookfor,average,在,MATLAB,的命令窗口中就会出现:,AVERAGE,求向量元素的均值,MEAN Average or mean value.,由于,H1,帮助行的特殊作用,所以在用户自己定义,M,函数文件时,一定要编写相应的,H1,帮助行,对函数进行简明、扼要的说明或者解释。,例子,13,的,008,、,010,、,012,、,015,行代码分别是程序具体的注释行,这些注释行不会显示在在线帮助中,主要原因就是这些注释行没有紧随在,H1,帮助行的后面,其中,008,行的注释与在线帮助之间有一个空行。其实从,008,行开始一直到文件的结尾都是,M,函数文件的代码行,这些代码行需要完成具体的算法,实现用户的具体功能。代码行就是用户开发的算法,M,语言的实现。,4.4.2,输入输出参数,M,语言函数文件的输入、输出参数和其他高级语言的输入、输出参数不同,在定义这些输入、输出参数的时候不需要指出变量的类型,因为,MATLAB,默认这些参数都使用双精度类型,这样可以简化程序的编写。而且在定义参数时,也没有确定输入参数的维数或者尺寸,也就是说,直接从参数上无法判断输入来的是标量、向量还是矩阵,只有通过程序内部的具体代码来加以判断。,M,语言的函数文件不仅可以有一个输入参数和一个返回值,还可以为,M,语言函数文件定义多个输入参数和多个输出参数,见例子,14,。,例子,14,多个输入、输出参数的,M,函数。,001function,avg,stdev,r=,ourstats(x,tol,),002%OURSTATS,多输入输出参数示例,003%,该函数计算处理矩阵,得到相应的均值、,004%,标准差和矩阵的秩,005m,n=size(x);,006if m=1,007 m=n;,008end,009%Average,010,avg,=sum(x)/m;,011%,Sandad,deviation,012,stdev,=sqrt(sum(x.2)/m-avg.2);,013%Rank,014s=,svd(x,);,015r=sum(s,tol,);,运行例子,4-15,,在,MATLAB,命令行中,键入下面的指令:,A=1 2 3;4 5 6,A=,1 2 3,4 5 6,a,s,r=ourstats(A,0.1),a=,2.5000 3.5000 4.5000,s=,1.5000 1.5000 1.5000,r=,2,ourstats(A,0.1),ans,=,2.5000 3.5000 4.5000,a,s=ourstats(A,0.1),a=,2.5000 3.5000 4.5000,s=,1.5000 1.5000 1.5000,例子,14,的,M,代码具有两个输入参数、三个输出参数,所以在使用该函数的时候,需要将必要的输入、输出参数写明。注意调用该函数时的语法,将输出参数依次写在一个向量中,若输出参数的个数与函数定义的输出参数个数不一致,则在例子,14,中,将计算得到的前几个输出参数作为返回值,个数等于用户指定的输出参数个数。计算的结果依次赋值给不同的变量。,在使用多个输入、输出参数的时候,往往需要判断用户写明的输入、输出参数的个数,若个数与函数定义不符合的时候,将给出错误或者警告信息,这个时候,需要使用函数,nargin,和,nargout,来获取函数的输入、输出参数个数,见例子,15,。,例子,15,nargin,和,nargout,示例。,001function c=,testarg(a,b,),002%TESTARG,检测输入输出参数个数,003%,该函数根据不同的输入输出参数个,004%,数进行相应的操作,005if(,nargout,=1),006,disp,(,使用该函数必须指定一个输出参数,!);,007 return,008end,009switch,nargin,010 case 0,011,disp,(,使用该函数至少需要一个输入参数,!);,012 c=;,013 return,014 case 1,015 c=a.2;,016 case 2,017 c=a+b;,018end,运行例子,4-16,,在,MATLAB,命令行窗口中,键入下面的指令:,A=1 2 3;,B=2 3 5;,testarg(A,B,),使用该函数必须指定一个输出参数,!,C=,testarg,使用该函数至少需要一个输入参数,!,C=,C=,testarg(A,),C=,1 4 9,C=,testarg(A,B,),C=,3 5 8,C=,testarg(A,B,C,),?Error using=,testarg,Too many input arguments.,运行例子,15,的代码时,使用不同的输入、输出参数,函数本身和,MATLAB,系统将自动检测参数的个数,在最后一次调用时,由于使用的输入参数个数超过了函数定义的个数,所以,MATLAB,给出了错误信息。,MATLAB,的,M,函数文件还可以具有个数不确定的输入、输出参数,也就是说,在定义,M,函数文件的时候,不指明输入、输出参数的个数,而是在程序中通过编写程序完成具体参数的确定,完成该功能主要依靠,varargin,和,varargout,函数。,当函数的定义具有以下形式的时候,function y=,function_name(varargin,),函数,function_name,可以接受任意个数的输入参数;而当函数具有下面的形式时,function,varargout,=function_name(n),函数,function_name,可以输出任意个数的输出参数。,可以将,varargin,函数和,varargout,函数结合在同一个,M,文件函数中使用。,例子,16,不确定的输入参数个数。,001function y=,varargin_example(varargin,),002%VARARGIN_EXAMPLE,不确定输入参数例子,003,str,=,sprintf,(,输入参数的个数,:=%,d,length(varargin,);,004,disp(str,);,005y=0;,006%,varargin,的类型,007,class(varargin,),008for i=1:length(varargin),009%,varargin,为元胞数组,010,if(isnumeric(varargini,),011%,将每个为数值数组的输入参数,012%,的第一个元素累加求和,013 y=y+varargini(1);,014 end,015end,运行例子,16,,在,MATLAB,命令行中键入下面的指令:,varargin_example,输入参数的个数,:=0,ans,=,cell,ans,=,0,varargin_example(a,1 2 3,3,rand(2,5),输入参数的个数,:=4,ans,=,cell,ans,=,4.0153,通过例子,16,的运行结果和例子的代码可以看出,varargin,函数的使用方法。它相当于在,MATLAB,的函数入口处开辟了足够大的空间,用于接受各种用户的输入。在使用这个函数的时候,需要在程序中判别函数输入参数的类别,并且从元胞数组中正确提取变量,在,MATLAB,中将这一过程称之为,unpacking,。,与之相对应的,将函数的输入参数传递给,varargout,函数被称之为,packing,,,在这一过程中,需要将所有必要的输出参数传递给,varargout,元胞数组,在传递参数的时候,还需要注意参数的顺序,在例子,17,中介绍了这一过程。,例子,17,不确定的输出参数。,001function,varargout,=,varargout_example(varargin,),002%VARARGOUT_EXAMPLE,不确定个数的输出参数,003,004%,判断输出参数的个数,005%,下面注释行中的代码执行有错误,006%,str,=,sprintf,(,输出参数的个数,:=%,d,length(varargout,);,007%,必须使用,nargout,008,str,=,sprintf,(,输出参数的个数,:=%,d,nargout,);,009,disp(str,);,010,if(nargout,a b=varargout_example(1,2,3,4),输出参数的个数,:=2,a=,4,b=,3,例子,17,的第,006,行代码,若将注释行符号“,%”,删除,则程序运行会出现错误。在程序中,若需要判断输出参数的个数不能使用,length,函数,而需要使用,nargout,函数。另外,在操作输出参数时,需要判断输出参数的个数,根据输出参数的个数完成相应的操作。,在使用不确定的输入、输出参数时,还可以像下面的代码行一样使用这两个参数:,function out1,out2=example1(a,b,varargin),function,i,j,varargout,=example2(x1,y1,x2,y2,flag),若使用,varargout,和,varargin,参数,除了必须给定的参数以外,其余的参数是任意数量可变的,具体的操作参阅例子,18,。,例子,18,可变的输入、输出参数。,001function,x,y,varargout,=,vararginout(a,b,c,d,varargin,),002%VARARGINOUT,可变的输入输出参数,003,str,=,sprintf,(,输入参数的个数,:=%,d,nargin,);,004,disp(str,);,005,str,=,sprintf,(,输出参数的个数,:=%,d,nargout,);,006,disp(str,);,007,if(nargin,2&,nargin,4),014 for(i=1:nargout-2),015%,这里也许会出错,小心!,016,varargouti,=vararginend-i-1;,017 end,018end,运行例子,18,的代码,在,MATLAB,命令行中,键入下面的指令:,vararginout(1,2,3,4,5),输入参数的个数,:=5,输出参数的个数,:=0,ans,=,10,a,b,c=vararginout(1,2,3,4,5,6,7,8),输入参数的个数,:=8,输出参数的个数,:=3,a=,10,b=,-2,c=,6,4.3,子函数和私有函数,同一个,M,函数文件中可以包含多个函数。如果在同一个,M,函数文件中包含了多个函数,那么将出现在文件中的第一个,M,函数称为主函数,(primary function),,,其余的函数称为子函数,(,subfunction,),。,M,函数文件的名称一般与主函数的名称保持一致,其他函数都必须按照函数的基本结构来书写,每一个函数的开始都是函数定义行,函数的结尾是另一个函数的定义行的开始或者整个,M,文件的结尾,(,最后一个子函数的结尾就是文件结束符,),。不过,子函数不像主函数,一般子函数没有在线帮助,子函数的作用范围有限,它只能被那些在定义子函数的,M,文件中定义的函数,(,包括主函数和其他子函数,),调用,不能被其他,M,文件定义的函数调用。,例子,19,子函数应用例子。,001function,avg,med,=,newstats(u,)%,主函数,002%NEWSTATS,计算均值和中间值,003n=length(u);,004,avg,=mean(u,n);%,调用子函数,005med=median(u,n);%,调用子函数,006,007function a=mean(v,n)%,子函数,008%,计算平均值,009a=sum(v)/n;,010,011function m=median(v,n)%,子函数,012%,计算中间值,013w=sort(v);,014if r
展开阅读全文

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


开通VIP      成为共赢上传

当前位置:首页 > 环境建筑 > 其他

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

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

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

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

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

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

客服