浅析MATLAB中的内联函数、匿名函数和函数函数

内联函数

       内联(inline)函数是MATLAB 7以前经常使用的一种构造函数对象的方法。在命令窗口、程序或函数中创建局部函数时,通过使用inline构造函数,而不用将其储存为一个M文件,同时又可以像使用一般函数那样调用它。

MATLAB中的内联函数借鉴了C语言中的内联函数,在C语言中,内联函数是通过编译器控制来实现的,它只在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的时间和空间开销。在MATLAB中也有类似的性质。由于内联函数是储存于内存中而不是在M文件中,省去了文件访问的时间,加快了程序的运行效率。

虽然内联函数有M文件不具备的一些优势,但是由于内联函数的使用,也会受到一些制约。首先,不能在内联函数中调用另一个inline函数;另外,只能由一个MATLAB表达式组成,并且只能返回一个变量。

创建一个内联函数非常简单,就是使用inline方法,例如:

>> f=inline('t^2-3*t-4')

f =

     Inline function:

     f(t) = t^2-3*t-4

MATLAB会通过检查字符串来推断自变量,例如上面的函数中t就是自变量,如果没有找到,将会使用x作为缺省的自变量,例如常数函数:

>> g=inline('3')

g =

     Inline function:

     g(x) = 3

另外,对于inline也支持多元函数:

>> h=inline('x+y')

h =

     Inline function:

     h(x,y) = x+y

这种创建方法等价于以下方法:

>> h=inline('x+y','x','y')

这种方式显式地指定了参数列表。

使用内联函数也很简单,如同手写一般,以f(t) = t^2-3*t-4为例,分别计算在t=2t=4时的函数值:

>> f(2)

ans =

    -6

>> f(4)

ans =

     0

对于多元函数类似。

匿名函数

       匿名函数(anonymous function)是MATLAB 7.0版提出的一种全新的函数描述形式,和内联函数类似,可以让用户编写简单的函数而不需要创建M文件,因此,匿名函数具有inline函数的所有优点,并且效率比inline函数高,同时还具有一些独有的特点。

       事实上匿名函数很像C语言中的宏,这个从匿名函数的构造就能够看得出来,但是它比宏的功能更加强大,就是可以支持变量替换,这将在后面的示例中有所体现。

定义一个匿名函数很简单,语法是fhandle=@(arglist) expression

其中fhandle就是调用该函数的函数句柄(function handle),相当于C语言中的函数指针,arglist是参数列表,多个参数使用逗号分隔,Expression则是该函数的表达式,例如定义xy的平方和函数:

>> f=@(x,y) x*x+y*y

f =

    @(x,y)x*x+y*y

一旦定义了匿名函数,使用方式和inline函数类似,例如计算f(3,4)

>> f(3,4)

ans =

    25

前面提到,匿名函数可以使用工作空间的变量,例如创建函数f(x,y)=x^2+y^3

>> p=2;

>> q=3;

>> f=@(x,y) x^p+y^q

f =

    @(x,y)x^p+y^q

计算f(2,3)

>> f(2,3)

ans =

    31

如果修改p或者q的值,例如将q改为2

q =

     2

>> f(2,3)

ans =

    31

计算结果并没有改变,这是因为,该函数句柄保存的是函数在创建时的快照,而不是动态的访问其中的变量,如果希望获取新值,需要重新创建一次该函数,完整的方法应该是这样的:

>> q=2;

>> f=@(x,y) x^p+y^q

f =

    @(x,y)x^p+y^q

>> f(2,3)

ans =

    13

匿名函数会让前面的内联函数逐步退出MATLAB的舞台,事实上在设计这种类型的函数时就带有这一目的,但是为了保持程序的向下兼容,使用内联函数无疑将带来更好的兼容性。

函数函数

       函数函数(function function)是对传入的其他函数进行操作的函数,传入的函数作为函数函数的输入参数,传入到函数函数中的函数称为传递函数(Passed function),事实上MATLAB中就有许多这样的函数,例如求解常微分方程的函数ode23ode45ode113等都是函数函数,他们的第一个参数都是传递函数。另外一个常见的函数函数是fplot,用于绘制所提供函数的图形,语法为fplot(fun,lims)

例如绘制x取值范围为[-π,π]f=sin(x)的图形:

>> fplot(@sin,[-pi,pi])

       图形如下:

pastedGraphic.png

 和前面两种函数不同,函数函数是比较复杂的函数了,因此必须要保存在M文件中,例如可以编写一个计算某个传递函数在给定区间上最大值、最小值和平均值的函数函数:

function [maxy,miny,aver]=fstatic(func,a,b,n)

    x=linspace(a,b,n);

    y=func(x);

    maxy=max(y);

    miny=min(y);

    aver=mean(y);

end

保存为M文件后,例如统计正弦函数在[-π,π]上的最大值、最小值和平均值:

>> fstatic(@sin,-pi,pi,100)

ans =

    0.9999

>> [max min aver]=fstatic(@sin,-pi,pi,1000)

max =

    1.0000

min =

   -1.0000

aver =

 -5.9291e-018


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二十世纪数学家排名

二十世纪数学家排名 陈彬整理2010.1.1 1.A.N.Kolmogorov(柯尔莫哥(戈)洛夫)——为概率论建立了公理体系的俄罗斯人,但排第一似乎有些不妥? 2.H.Poincare(庞加莱(Jules Henri Poincar))——有些人不需要说明,H.庞加莱就是其中之一。 3.D.Hilbert(希尔伯特…

Matlab英文操作系统下中文乱码的解决方案

打开注册表(win+R,运行框中输入regedit),然后进入HKEY_CURRENT_USER\Control Panel\International,将右侧 : "Locale""00000409" 改成 "Locale""00000804&q…

Git 从了解到放弃

1. 简单介绍 1.1. git起源 在1991年linus创建了Linux从此linux成为服务器领域的佼佼者,大部分web服务器、邮件、数据库各种服务器端程序都安装在了linux上面运行,主要是因为它运行的快速、高效、利用率高,这样一个优秀的系统并不是一个人在维…

LIS(Longest Increasing Subsequence)最长上升(不下降)子序列

有两种算法复杂度为O(n*logn)和O(n^2)O(n^2)算法分析如下: (a[1]...a[n] 存的都是输入的数)1、对于a[n]来说,由于它是最后一个数,所以当从a[n]开始查找时,只存在长度为1的不下降子序列;2、若从a…

java ee 的使用方法_改善Java EE生产支持技能的8种方法

java ee 的使用方法参与Java EE生产支持的每个人都知道这项工作可能很困难。 7/24寻呼机支持,多个事件和错误修复(要定期处理),来自客户和管理团队的压力,要求它们尽快解决生产问题并防止再次发生。 在日常工作中&…

Tp3.1 文件上传到七牛云

TP3.1 中不支持Composer 就无法用composer 安装 下载历史的SDK https://github.com/qiniu/php-sdk/releases/tag/v7.0.8 下载下来放到 Think 目录下的Vendor下 进入代码 HTML的代码 <form id"upload" methodpost action"file" enctype"multipart/f…

Matlab元胞数组操作

元胞数组 删除行的方法比较特殊 A(i,:)=[];%注意,两边都没有用花括号 元胞数组中的操作函数 cell:创建空的元胞数组 cellfun:为元胞数组的每个元胞执行指定的函数 celldisp:显示所有元胞的内容 cellplot:利用图形方式显示元胞数组 cell2mat…

激励自己的名言警句

激励自己的名言警句 1、忍别人所不能忍的痛&#xff0c;吃别人所别人所不能吃的苦&#xff0c;是为了收获得不到的收获。 2、销售是从被别人拒绝开始的。 3、好咖啡要和朋友一起品尝&#xff0c;好机会也要和朋友一起分享。 4、生命之灯因热情而点燃&#xff0c;生命之舟因拼搏…

Java Spring 后端项目搭建

参考了几位同行的Blogs和StackOverflow上的许多问答&#xff0c;搭建了此后端项目&#xff0c;替换原来的node.js后端&#xff0c;和前一篇中搭建的Vue Web App项目配合使用&#xff0c;后端准备只提供服务&#xff0c;不包含后端装配的页面&#xff0c;打算只使用MongoDb和Red…

新电子书:解决生产中Java应用程序错误的完整指南

构建明智的错误处理工作流程需要什么&#xff1f; 生产异常处理是一门黑暗的科学。 一旦您的代码投入生产&#xff0c;任何小的缺陷或故障都可以转化为数百万个日志事件。 尤其是在将异常作为控制流的一部分使用的情况下。 它是研究最少的主题&#xff0c;对您的应用程序的行…

Matlab运行指定m文件

当m文件在当前目录时可以直接输入该m文件的名字运行&#xff0c;但是当不在当前目录时可以使用run(filename)的方式运行&#xff0c;使用edit(filename)还可以直接编辑&#xff0c;当然filename可以包含文件路径。

在VC中使用MATLAB C++函数库

http://Tech.16C.Cn 在VC中使用MATLAB C/C函数库 MATLAB广泛应用于线性代数、自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等领域。因此如果在VC中对MATLAB进行调用将大大减少编程的工作量、保证程序的准确性&#xff0c;并且继承了VC强大的功能&#x…

转帖 IBM要推POWER9,来了解一下POWER处理器的前世今生

https://blog.csdn.net/kwame211/article/details/76669555 先来说一下最新的POWER 9 在Hot Chips会议上首次提到的IBM Power 9 处理器有可能成为劲爆芯片&#xff0c;Power 9预计有助新 OEM 和加速器合作伙伴的发展&#xff0c;并可为大蓝色IBM叫板主要竞争对手英特尔的高端服…

java线程死亡_Java模因拒绝死亡

java线程死亡也有标题&#xff1b; 我的宠物讨厌Java编码。 有许多Java模因让我很烦&#xff0c;部分是因为它们总是一个坏主意&#xff0c;但主要是因为人们在找到更好的替代方案后的几年里仍在不断地选择它们。 使用StringBuffer代替StringBuilder 从2004年开始&#xff0c…

Eclipse报错 due to restriction on required library C:/Java/jdk1.6.0_10/jre/lib/rt.jar 解决方案

Eclipse报错 due to restriction on required library C:/Java/jdk1.6.0_10/jre/lib/rt.jar 解决方案Eclipse 编译时报错&#xff1a; Access restriction:The type NEW is not accessible due to restriction on required library C:/Java/jdk1.6.0_10/jre/lib/rt.jar 解决…

Matlab找到不知道的函数名

如果你知道和你要找到类似的函数的函数名&#xff0c;可以在help中查看你知道的函数名&#xff0c;然后再最下面会列出几个类似的函数&#xff0c;也许这里就有你要找的函数

asp.net core 自定义401和异常显示内容(JWT认证、Cookie Base认证失败显示内容)

asp.net core 2.0使用JWT认证园子里已经有挺多帖子了&#xff0c;但开发中发现认证未授权情况下返回的401状态码是没有任何信息的&#xff0c;业务中可能有需要返回一串错误的Json信息。在这里我分享一个自定义错误页面内容信息的方法&#xff0c;使用该扩展方法还可以捕获异常…

关于ANTLR的通用库的需求:使用反射来构建元模型

我是一名语言工程师&#xff1a;我使用多种工具来定义和处理语言。 在其他工具中&#xff0c;我使用ANTLR&#xff1a;它简单&#xff0c;灵活&#xff0c;可以围绕它进行构建。 但是&#xff0c;我发现自己围绕ANTLR为不同的项目重建了类似的工具。 我看到两个问题&#xff1…

创建和应用Java包文件的两种方式(转)

创建和应用Java包文件的两种方式(转) 《Java编程艺术》章节选登。作者&#xff1a;高永强 清华大学出版社 &#xff08;即将出版&#xff09; 12.1 包——package 。。。 12.1.1 包命名规范 为了确保包文件名称的唯一性&#xff0c;Java对应用软件开发者&#xff0c…

MATLAB double、str、cell间的类型转换

注&#xff1a;转换的前提是数组的格式符合目标数组的要求&#xff0c;能够转换。不然会失败str2numstr2doublesrt2matstrvcatstrcatcellstr字符数组转为元胞数组&#xff08;没有strcell&#xff09;int2str整数转换为字符串数组&#xff0c;非整数将四舍五入num2str非整数数组…