创建博客 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

李小一的梦想世界

 
 
 

日志

 
 

Matlab中函数作为参数的调用  

2008-10-30 22:39:47|  分类: matlab |  标签: |举报 |字号 订阅

       差点忘记了,本博可是“技术博”...

       最近看了一点关于DCD算法的东西,想把它编出来实现一下。想到每次计算用到的对象函数是不一样的,所以在编写的m function里就要涉及到函数作为形参的调用问题,以前没做过,就查了一点资料;当然直接用@调用简单形式的函数是没问题的,比如:  

a=myalg(@sin,c,d)   %myalg是自己写的算法,@sin就表示对象函数为sin正弦函数,c,d为其他参数

a=myalg(@(x)(x^2-2),c,d)    % @(x)(x^2-2)定义了一个函数 变量为x,值为x^2-2

需要注意的一点是,如果在command窗口直接这么执行是没问题的,但要想在m文件里这么写,那就需要在执行语句外面定义个"主"函数:

       function  test()

      a=myalg(@sin,c,d);

      end

否则,会报一个'Function definitions are not permitted at the prompt or in scripts.‘的错,至于为何,我还没想出来      

接上面,如果函数是自己定义的一个function,在调用的时候就需要注意一些问题了

xiaokai (一个不懒惰的人) 于 2006年12月26日11:22:08 星期二 提到:

调用一个函数,一般是传递其函数句柄。

当你定义了一个函数Temp.m的时候,function kernel = Temp(x)

那么使用quad调用它,通常的写法是 quad(@Temp,-1,1);

而出错的原因,不是函数格式的错误,而是程序代码编写的问题。

在quad.m里面可以看到,在积分前,它会做这么一件事情,

feval(f,x,vargin{:}),

这里,f是你的Temp,x则是利用[-1,1]这个区间插值出来的一个矢量。

显然,你编写的Temp(x)是不支持矢量作为输入的。

if( (x<=1) && (x>=-1) ) % x 是vector时,无法解析。

这段话是从ustc的bbs上找到的,他说明了一个道理:如果要直接调用自己的函数,由于某些函数中默认feval的存在,则自己写的函数必须是针对向量来编码的,如下面这个例子:

function test1()  %‘主’函数
       clc
       b=myalg(@myfun,5,2)
       end
       function y=myfun(x)   %自己定义的函数
       y=sin(x(1))+cos(x(1));
       end
       function z=myalg(f,e,g) %用于计算的主函数
       in=f(e);
       out=f(g);
       z=in+out;
       end

如果第六行写成y=sin(x)+cos(x);则在某些现有的或者自定义的myalg算法下,myfunc()的调用会出现问题,不过看起来matlab7.1b做了很好的改进,上面他所讲的quad函数并没有存在这样的问题,而且我一开始自己定义的myalg在myfun定义为标量时确实出现了上面所提到的问题,结果过了一小时再试验的时候问题消失了真是奇哉,怪也!

其实,我还想到另一个解决办法:既然feval(f,x,vargin{:})在搞鬼的话,那我们就给它重载一下,在自己的算法里加上几句,如:

function z=gie(f,e,g)
       in=feval(@ssi,e);
       out=feval(@ssi,g);
       z=in+out;
       end

则在myfun里面即使用scalar应该也不会出什么问题了,不过对于matlab自带的一些quad之类的(我看了一下,已经由原来的feval()改为直接的f()了),则没法这么改了,就只有在自己的函数上下工夫,写成vector的形式。

  评论这张
 
阅读(1929)| 评论(1)
|      
推荐 转载

历史上的今天

最近读者

热度

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2014