zoukankan      html  css  js  c++  java
  • matlab中关于函数句柄、feval函数以及inline函数的解析 (转)

    http://blog.sina.com.cn/s/blog_7bff755b010180l3.html

    MATLAB函数句柄

    函数句柄(Function handle)是MATLAB的一种数据类型。

    包含了函数的路径、函数名、类型以及可能存在的重载方法;

    引入函数句柄是为了使feval及借助于它的泛函指令工作更可靠;使“函数调用”像“变量调用”一样方便灵活;提高函数调用速度,特别在反复调用情况下更显效率;提高软件重用性,扩大子函数和私用函数的可调用范围;迅速获得同名重载函数的位置、类型信息。

    --------------------------------------

    可以与变量一样方便地使用:比如说,在现在这个目录运行时,创建了本目录一个函数的句柄,当转到其他目录时,可以通过函数句柄直接调用上一个目录的函数,而不需要把那个函数文件复制过来,因为创建的函数句柄中已经包含了路径信息;

    提高函数调用速度:因为matlab对函数的调用每次都是要搜索所有的路径,从set path中可以看到,路径是非常的多的,所以如果一个函数在程序中需要经常用到的话,使用函数句柄,对速度会有提高的;

    --------------------------------------

    MATLAB中函数句柄的使用使得函数也可以成为输入变量,并且能很方便的调用,提高函数的可用性和独立性。

    函数句柄实际上提供了一种间接调用函数的方法。
    创建函数句柄需要用到操作符@

    创建函数句柄的语法:
    fhandle = @function_filename

    调用函数时就可以调用该句柄,可以实现同样的功能。

    例如fhandle = @sin就创建了sin的句柄,输入fhandle(x)其实就是sin(x)的功能。

    % % ------------------------------------------------

    fhandle=@sin

    fhandle(pi)

    sin(pi)

    % % ------------------------------------------------

    例如:

    新建M文件f1.m

    function y=f1(X)

    x1=X(1);x2=X(2);
    y=x1^2+x1*x2;

    新建M文件ftest.m

    function Y=ftest(f,X)

    syms x1 x2;
    F=f([x1,x2]);
    v=[x1,x2];
    grad=jacobian(F,v);
    Y=subs(grad,v,X);

    在MATLAB命令窗口输入Y=ftest(@f1,[2,1]),得到结果:

    Y =

        5    2

    此处@f1即为函数f1的句柄,可以用class(@f1)判断变量的类型,得到ans = function_handle即函数句柄。函数ftest是求一个二维函数在指定点的梯度值。我们可以替换目标函数为f2或其他函数同样可以求得梯度。这样函数ftest就可以适用于任何二维函数而不必做改动了。

    feval函数如何理解
    feval函数的最通常的应用是以下形式:
    feval_r('functionname',parameter),举个简单的例子:
    比如要计算sin(2),当然可以直接用命令y=sin(2);利用feval,还可以这样来做:
    y=feval_r('sin',2);另外这里的函数名字还可以是一个函数句柄,即h=@sin;
    y=feval_r(h,2);或者直接写成y=feval_r(@sin,2);

    内连函数(inline function)

    inline函数不是函数句柄, 是另外一种类型, 它也可以用变量来表示函数, 用法也和一般函数, 函数句柄是一样的.内联函数和普通的函数句柄,准确说跟匿名函数比较类似,可以通过一个函数表达式近而得到该函数。

    在matlab中创建局部函数时,可用inline。优点是不必将其储存为一个单独文件。在运用中有几点限制:不能调用另一个 inline函数,只能由一个matlab表达式组成,并且只能返回一个变量---显然不允许[u,v]这种形式。因而,任何要求逻辑运算或乘法运算以求得最终结果的场合,都不能应用inline。

    语法格式如下:

    1 变量名=inline(表达式);

    2 变量名=inline('函数表达式', '变量名1','变量名2', ... ,'变量名n');(推荐)

    例如:

    a='x+y';

    f=inline(a);
    f(2,3)

    ans =

        5

    或者:

    f=inline('x+y','x','y');

    f(2,3)

    ans =

        5

    inline函数可以对某个变量调用数组,如:

    Fofx=inline(‘x .^2*cos(a*x)-b’ , ‘x’,’a’,’b’);

    g= Fofx([pi/3 pi/3.5],4,1)

    系统输出为:g=-1.5483 -1.7259

  • 相关阅读:
    flask 返回json数据
    flask 中文乱码
    flask 参数校验
    AOP集成防止连续多次点击问题
    关于横竖屏切换导致的Activity重建问题
    Flutter工程无法找到Android真机或Android模拟器
    Failed to find configured root that contains
    Unable to resolve dependency问题解决
    双重ScrollView,RecyclerView联动实例
    RecyclerView联动滑动失败
  • 原文地址:https://www.cnblogs.com/aminxu/p/4686577.html
Copyright © 2011-2022 走看看