聪明文档网

聪明文档网

最新最全的文档下载
当前位置: 首页> Matlab函数进阶:使用匿名函数和内嵌函数处理多变量传递问题

Matlab函数进阶:使用匿名函数和内嵌函数处理多变量传递问题

时间:2016-01-15 19:29:22    下载该word文档

Matlab函数进阶:使用匿名函数(Anonymous Function)和内嵌函数(Nested Function)处理多变量传递问题(Matlab 7.0以上)

问题:有一个多变量函数f(aword/media/image1.gifbword/media/image1.gifcword/media/image1.gifx),现需要分别在a=a0word/media/image1.gifb=b0word/media/image1.gifc=c0a=a1word/media/image1.gifb=b1word/media/image1.gifc=c1的条件下对f(aword/media/image1.gifbword/media/image1.gifcword/media/image1.gifx)进行某一操作。

此类问题常在数值积分时出现。

解决方案:

1.使用全局变量

可在主调函数和被调函数中分别将a,b,c声明为全局变量(globala b c),这时f通过全局变量传递abc,定义时可以只有一个参数x

2.使用anonymous function

3.使用 nested function

下面举例说明anonymous functionnested function的使用。

例:对任意二次多项式 ax2+bx+c 进行数值积分(此处显然可以解析得到,此例使用anonymous
function做演示)

解:(1)使用匿名函数

编写文件intpoly2.m
如下

functiony_int=intpoly2(a,b,c)

y_int=quad(@(x)(poly2(a,b,c,x)), 01); %此处利用matlab内部函

%数quad(fun, x0,xt)进行积分,

%被积函数fun我们使用匿名函

%数"@(x)(poly2(a,b,c,x))"以便

%将自变量限制为x.

function y=poly2(ai,bi,ci,x)%此处定义一个多变量的子函数 poly2( a,b,c,x)

y=ai.*x.^2+bi.*x+ci; %此处使用矩阵元素运算(.* 和.^)等便于

%被矩阵化的内部函数调用,且提高程序效率

执行:

保存该文件并将matlab切换至该文件目录下,命令行输入intpoly2(1,2,3),便给出积分结果ans=4.33

2)使用nested function

编写函数保存为intnest.m,内容如下

functiony_int=intnest(a,b,c)

y_int=quad(@poly2, 01); %此处利用matlab内部函

%数quad(fun, x0,xt)进行积分,

%被积函数fun我们使用内嵌函

%数poly2(x)的句柄@poly2

function y=poly2(x)%此处定义一个内嵌函数 poly2( a,b,c,x)

y=a.*x.^2+b.*x+c; %直接调用母函数中的变量a,b,c

end% 结束内嵌函数poly2

end% 结束母函数intpoly2

保存后执行,同样效果。

可见nested function只是将主调函数和被调函数封装到了一起以共享主调函数的变量。

注意:一般函数不需要end,当出现nested function时,主调函数和被调函数都必须有end 来结束

附:

M脚本文件和M函数文件、函数句柄

m文件分两种:函数和脚本。

1、matlab script file:

脚本文件没有输入输出,对工作空间(workspace)中的变量进行操作。

任何可执行的matlab命令都可以写入脚本文件。先来看一个简单的例子:

例1: 产生一个20元素的一维随机数组并画出。

解: 新建一个m文件命名为randplt.m(或者任何你喜欢的名字), 在其中加入如下两行代码

:

data=randn(1,20);

plot(data);

保存后选择debug/run菜单或按F5键运行,观察workspace中多出了一个变量data。

脚本文件执行时, 就如同将文件中的每一条命令依次输入到matlab命令行中一样, 顺次执

行。你可以尝试在command history窗口中按住ctrl键选择几行执行过的命令并单击鼠标右

键在快捷菜单中选择creat M file来快速创建一个m文件。

2、matlab function

函数文件可以接受输入和给出输出,当然也可以没有,就像c语言的函数。matlab函数最大的

书写特点(同C比起来)是它的输出变量定义在函数名前面。看一例:

例2: matlab内部函数std给出数组的标准差std=sqrt(sum(X)/N),编写函数stderr求实验误

差err=sqrt(sum(X)/(N*(N-1))), 代码如下:

function err=stderr(arr)

%实验误差(标准差估计)

%caculate along each column of arr

err=std(arr)./sqrt(size(arr,1)-1);

文件存为stderr.m, 运行时输入a=[1;2;3];建立一个列数组a, 然后输入stderr(a)则给出

a的方差。(若输入行数组则发散,因N-1=0)

此例中输入变量为arr, 函数名为stderr, 输出变量err, 此三者皆写在关键字function后

面同一行。无需再使用return将err的值返回。

注意:

(1)函数文件的命名要使用文件内主函数声明的名称,否则出错。

(2)函数内部可以嵌套子函数并为该文件的主函数调用,只需将子函数写在主函数代码后

面。

(3)一个函数可以有多个输入输出。如function [y1,y2]=myfun(x1,x2,x3)

例1中的m文件可在第一行前插入一行:

function randplt

保存后则该文件成为一个没有输入输出宗量的函数。

一般来说matlab中执行同样的任务使用函数文件比脚本文件的效率高。

3.函数句柄的使用

函数句柄起到c语言中函数指针的作用。

例3: 编写函数求出数组arr1和arr2的标准差(std)以及误差(stderr)。

解: 编写如下文件并保存为erreval.m

function [s1,s2]=erreval(err,arr1,arr2)

% err为所调用的误差函数,s1,s2分别返回arr1和arr2的误差.

s1=feval(err,arr1);

s2=feval(err,arr2);

此文件的输入包含"函数变量", 通过函数句柄实现函数变量err的赋值。

运行时先运行如下命令建立数组arr1,arr2:

arr1=[1;2;3];

arr2=[10;20;30];

然后输入

[std1,std2]=erreval(@std,arr1,arr2)

[stderr1,stderr2]=erreval(@stderr,arr1,arr2)

执行后返回四个误差值。

@std,@stderr为两误差函数的函数句柄。

  • 29.8

    ¥45 每天只需1.0元
    1个月 推荐
  • 9.9

    ¥15
    1天
  • 59.8

    ¥90
    3个月

选择支付方式

  • 微信付款
郑重提醒:支付后,系统自动为您完成注册

请使用微信扫码支付(元)

订单号:
支付后,系统自动为您完成注册
遇到问题请联系 在线客服

常用手机号:
用于找回密码
图片验证码:
看不清?点击更换
短信验证码:
新密码:
 
绑定后可用手机号登录
请不要关闭本页面,支付完成后请点击【支付完成】按钮
遇到问题请联系 在线客服