Matlab的函数文件、匿名函数、函数递归调用、函数参数的可调性、全部变量与局部变量

函数文件

函数文件和之前的脚本文件类似,基本格式如下:
function 输出形参表=函数名(输入形参表)
注释说明部分
函数体语句

(这里面也可以有return语句)

1.当有多个形参时,形参之间用逗号分隔,组成形参表。
2.当输出形参多于一个时,应该用方括号括起来,构成一个输出矩阵。
3. 函数文件名通常由函数名再加上扩展名.m组成,函数文件名与函数名也可以不相同,这时以函数文件名为准,但为了理解方便,二者名字取一样。

函数调用:
调用是在命令行窗口或者脚本文件中进行的,调用格式:
[输出实参表]=函数名(输入实参表)
在调用函数时,函数输入输出参数称为实际参数,简称实参。

不能用矩阵代替输出实参表

function [s,l] = fcircle(r)
%UNTITLED9 此处显示有关此函数的摘要
%   此处显示详细说明    //Matlab中'%'相当于C中的'//',起注释作用
s=pi*r*r;
l=2*pi*r;
end             //这时一个有返回值的函数

函数文件fcircle.m如上所示,在命令行窗口中进行调用

>> r=3;
>> [s,p]=fcircle(r)       //[s,p]接收返回值
s =
   28.2743
p =
   18.8496
但是不能用矩阵代替[s,p],如下所示:
A =
     []
>> A=fcircle(r)
A =
   28.2743            //这样就是错误的,必须用输出实参表的形式

匿名函数

基本格式如下:
函数句柄变量=@(匿名函数输入参数)匿名函数表达式
或者 函数句柄变量=@函数名
其中,@是函数句柄的运算符,第二种格式的函数名可以是内部函数或者自定义的函数。
直接在命令行窗口进行输入:

>> f=@(x,y) x^2+y^2
f =
  包含以下值的 function_handle:
  
    @(x,y)x^2+y^2
>> f(3,4)
ans =
    25

>> h=@sin     //sin函数是内部函数
h =
  包含以下值的 function_handle:

    @sin
>> h(pi/2)
ans =
     1

例1:

用匿名函数写第一个f(n),函数文件写第二个f(n)
函数文件f2.m如下:

function f = f2(n)
f=0;
for i=1:n
    f=f+i*(i+1);
end

脚本文件function1.m如下,在脚本文件中调用函数f1和f2,

f1=@(n) n+10*log(n*n+5);    //Matlab中ln就是log,lg是log10
y1=f1(40)/(f1(30)+f1(20))
y2=f2(40)/(f2(30)+f2(20))

命令行窗口运行:


>> function1
y1 =
    0.6390
y2 =
    1.7662

思考:第一个函数f1可以用函数文件简单表示,但第二个函数f2怎么用匿名函数表示?好像不能。

函数的递归调用

例2:利用函数的递归调用求n!
函数文件fact.m如下:

function f = fact(n)
if n<=1
    f=1;
else
    f=fact(n-1)*n;  %递归调用求(n-1)!
end

在脚本文件function2.m调用函数文件fact.m:

n=input('n=?');
s=fact(n);
disp(s)

例3:利用函数的递归调用求斐波那契数列
        f1=1   f2=1
        fn=fn-1+fn-2   (n>2)

函数文件ffib.m如下:

function f = ffib(n)
if n==1 || n==2 
    f=1;
else
    f=ffib(n-1)+ffib(n-2);
end

在脚本文件function3.m调用函数文件ffib.m进行验证:

F=[];
n=input('n=?');
for k=1:n
    F=[F,ffib(k)*ffib(k)];
end
front=sum(F)
behind=ffib(n)*ffib(n+1)

命令行窗口运行:

>> function3
n=?10
front =
        4895
behind =
        4895

函数参数的可调性

nargin,即输入参数的个数
nargout,即输出参数的个数

function f = test1(a,b,c)
%   这就像Java中函数的重载
if nargin==1
    f=a;
elseif nargin==2
    f=a+b;
elseif nargin==3
    f=(a*b*c)/2;
end

建立函数文件test1.m,在命令行窗口进行测试:

>> test1(2)
ans =
     2
>> f=test1(2,3,2)
f =
     6

全局变量与局部变量

定义全局变量用global声明,所有的函数都可以对其存取和修改。

function f = wad(a,b)
global x y
f=x*a+y*b;
end

建立函数文件wad.m,并在命令行窗口进行测试:

>> global x y
>> x=1;
>> y=2;
>> s=wad(1,2)
s =
     5
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值