五Matlab编程入门二.ppt
数学实验Matlab 编程(二)function 输出形参列表输出形参列表=函数名函数名(输入形参列表输入形参列表)%注释说明部分注释说明部分(可选可选)函数体语句函数体语句(必须必须)u 第一行为第一行为引导行引导行,表示该,表示该 M文件是函数文件文件是函数文件u 函数名的命名规则与变量名相同函数名的命名规则与变量名相同(必须以字母开头必须以字母开头)u 当输出行参多于一个时,用当输出行参多于一个时,用方括号方括号括起来括起来u 函数必须是一个函数必须是一个单独的单独的 M文件文件u 函数函数文件名必须与函数名一致文件名必须与函数名一致u 以以百分号百分号开始的语句为开始的语句为注释语句注释语句函数文件函数文件q 函数文件由函数文件由 function 语句引导语句引导function y=myfliplr(x)%myfliplr Flip matrix in left/right direction.%returns X with row preserved and columns%flipped in the left/right direction%X=1 2 3 becomes 3 2 1%4 5 6 6 5 4%num_col=size(x,2);%取取 x 的列数的列数y=x(:,num_col:-1:1);函数文件举例函数文件举例myfliplr.mfunction printyh(n)%打印杨辉三角形打印杨辉三角形,本函数没有输出参数本函数没有输出参数yh=1;disp(yh);if n=1,return;endyh=1,1;disp(yh);for k=3:n yh_old=yh;k2=ceil(k/2);for l=2:k2 yh(l)=yh_old(l-1)+yh_old(l);end yh(k2+1:k)=yh(k-k2:-1:1);disp(yh);end函数文件举例函数文件举例printyh.m例例:编写函数文件求半径为编写函数文件求半径为r的圆的面积和周的圆的面积和周长。长。函数文件如下:函数文件如下:function s,p=fcircle(r)%CIRCLE calculate the area and perimeter of a circle of radii r%r 圆半径圆半径%s 圆面积圆面积%p 圆周长圆周长s=pi*r*r;p=2*pi*r;函数申明行函数申明行帮助文本区帮助文本区函数体函数体输入参数输入参数输出参数输出参数程序程序2:建立一个函数,将华氏温度转变为摄氏温度,已知公式为:c=5*(f-32)/9首先建立函数文件首先建立函数文件f2c.m。function c=f2c(f)函数定义行函数定义行%compute the Fahrenheit temperature to Celsius temperature c=5*(f-32)/9 函数主体函数主体然后在然后在MATLAB的命令窗口调用该函数文件。的命令窗口调用该函数文件。clear;y=input(Input Fahrenheit temperature:);x=f2c(y)输出情况为:输出情况为:Input Fahrenheit temperature:70c=21.1111x=21.1111利用函数文件,实现直角坐标利用函数文件,实现直角坐标(x,y)与极坐标与极坐标(,)之间之间的转换。的转换。【数学基础数学基础=sqrt(x*x+y*y),=atan(y/x)】函数文件函数文件tran.m:function rho,theta=tran(x,y)rho=sqrt(x*x+y*y);theta=atan(y/x);调用调用tran.m的命令文件的命令文件main1.m:x=input(Please input x=:);y=input(Please input y=:);rho,the=tran(x,y);rhotheq 函数调用的一般格式函数调用的一般格式输出实参列表输出实参列表=函数名函数名(输入实参列表输入实参列表)u 函数调用时,函数调用时,实参的顺序实参的顺序应与函数定义时的应与函数定义时的形参的顺形参的顺序序一致。一致。u 函数可以函数可以嵌套调用嵌套调用,即一个函数可以被其它函数调用,即一个函数可以被其它函数调用,甚至可以被它自身调用,此时称为甚至可以被它自身调用,此时称为递归调用递归调用。u 函数所传递的参数具有可调性,函数所传递的参数具有可调性,Matlab 用两个永久变用两个永久变量量 nargin 和和 nargout 分别记录调用该函数时的输入实分别记录调用该函数时的输入实参和输出实参的个数。参和输出实参的个数。函数调用函数调用%函数文件函数文件 factor.mfunction f=factor(n)if(n=1)f=1;else f=n*factor(n-1);end%main.m%计算计算 s=1!+2!+3!+4!+5!%s=0;for i=1:5 s=s+factor(i);endfprintf(s=%g n,s)例:利用函数的递归调用计算例:利用函数的递归调用计算 n!递归函数举例递归函数举例%ex4argin.mfunction out=ex4argin(a,b)if(nargin=1)out=a;elseif(nargin=2)out=a*b;end参数的可调性举例参数的可调性举例%ex4argout.mfunction p,q=ex4argout(a,b)if(nargout=1)p=a+b;elseif(nargout=2)p=a+b;q=a-b;endq 函数通过函数通过输入和输出参数输入和输出参数与其它与其它 M 文件进行数据传递。文件进行数据传递。q 当函数调用完毕后,该函数文件中定义的所有局部变量当函数调用完毕后,该函数文件中定义的所有局部变量都将被释放,即都将被释放,即全部被清除全部被清除。q 如果在若干个如果在若干个 M文件中,文件中,都把某个变量定义为全局变量都把某个变量定义为全局变量,则这些函数将公共使用这一变量则这些函数将公共使用这一变量。所有函数都可以对它进所有函数都可以对它进行存取和修改操作。行存取和修改操作。q 函数文件中的变量都是函数文件中的变量都是局部局部的,即一个函数文件中定义的,即一个函数文件中定义的变量不能被另一个函数文件或其它的变量不能被另一个函数文件或其它 M 文件使用。文件使用。全局变量与局部变量全局变量与局部变量q 定义全局变量是定义全局变量是 M文件间传递信息的一种手段。文件间传递信息的一种手段。l 变量名列表中的各个变量变量名列表中的各个变量用空格隔开用空格隔开,不能用逗号!,不能用逗号!全局变量给函数间的数据传递带来了方便,但却破坏全局变量给函数间的数据传递带来了方便,但却破坏了函数对变量的封装,降低了程序的可读性,因而了函数对变量的封装,降低了程序的可读性,因而在在结构化程序设计中,全局变量是不受欢迎的结构化程序设计中,全局变量是不受欢迎的。特别是。特别是当程序较大,子程序较多时,全局变量将个程序调试当程序较大,子程序较多时,全局变量将个程序调试和维护带来不便,故不提倡使用全局变量。和维护带来不便,故不提倡使用全局变量。global 变量名列表变量名列表全局变量的定义全局变量的定义程序示例程序示例clear;global a ba=1;b=3;y=mysquaresum(a,b);fprintf(a=%g,b=%g n,a,b);z=myproduct(a,b);fprintf(a=%g,b=%gn,a,b);function square_sum=mysquaresum(x,y)square_sum=x2+y2;function product=myproduct(x,y)global aproduct=x*y;a=x+y;子函数子函数function avg,med=ex4subfun(x)%主函数主函数 n=length(x);avg=mean(x,n);med=median(x,n);function a=mean(x,n)%子函数子函数a=sum(x)/n;function m=median(x,n)%子函数子函数x=sort(x);if rem(n,2)=1 m=x(n+1)/2);else m=(x(n/2)+x(n/2+1)/2;end子函数子函数u 函数文件中可以含有一个或多个子函数函数文件中可以含有一个或多个子函数u 子函数由子函数由 function 语句引导语句引导u 主函数必须位于最前面,子函数出现的次序任意主函数必须位于最前面,子函数出现的次序任意u 子函数只能被主函数和位于同一个函数文件中的其它子子函数只能被主函数和位于同一个函数文件中的其它子函数调用函数调用u 除了用除了用 global 定义的全局变量外,子函数中的变量都定义的全局变量外,子函数中的变量都是局部变量,子函数与主函数及其它子函数之间通过输入、是局部变量,子函数与主函数及其它子函数之间通过输入、输出参数进行数据传递输出参数进行数据传递q 调用一个函数时,调用一个函数时,Matlab 会首先检查该函数是否为一个会首先检查该函数是否为一个子函数。子函数。课堂练习课堂练习例题.将A矩阵用for循环写出来 A=1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8例:编写例:编写m函数,计算函数值函数,计算函数值 x (x1)2x-1 (1x=10)例题:从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。程序如下:sum=0;cnt=0;val=input(Enter a number(end in 0):);while(val=0)sum=sum+val;cnt=cnt+1;val=input(Enter a number(end in 0):);end if(cnt 0)sum mean=sum/cnt endn例题:求100,500之间前5个能被21整除的整数。clc,clear,s=1;n=100:500;for i=1:length(n)if rem(n(i),21)=0 m(s)=n(i);s=s+1;continue,endif s=6 break endendmu例题:例题:用用for循环指令来寻找循环指令来寻找Fibonacc数组中第一个大于数组中第一个大于10000的元素:的元素:【a(1)=1,a(2)=1,a(i)=a(i-2)+a(i-1)】clc,clear,n=100;a=ones(1,n);for i=3:n a(i)=a(i-2)+a(i-1);if a(i)10000 a(i),break;endendi