匿名函数与之相对的即为需要.m文件存储的命名函数,匿名函数可以在任意地方定义(包含命令行窗口),且由于没有固定的名称,函数是可以像变量一样被传递的。以下详细讲解一下MATLAB中不可或缺的一部分具体能够怎么用:

先给个目录,千万不要被吓到:

目录

  • 1 匿名函数的生成
    • 1.1基础生成
    • 1.2 多参数匿名函数
    • 1.3 含定参匿名函数
    • 1.4 sym转匿名函数
    • 1.5 字符串转匿名函数
    • 1.6 函数工厂(匿名函数的自动生成)
      • 1.6.1 已知参数个数
      • 1.6.2 未知参数个数
    • 1.7 拟合结果转匿名函数
    • 1.8 匿名函数的引用
    • 1.9 匿名函数的传递
    • 1.10 无参数匿名函数
    • 1.11 可变长度输入参数列表
    • 1.12 多返回值匿名函数
    • 1.13 命名函数转化为匿名函数
  • 2 匿名函数的结构
    • 2.1 匿名函数数组
    • 2.2 匿名函数结构体
    • 2.3 匿名函数的非标量结构体数组
    • 2.4 functions函数使用
    • 2.5 局部命名函数的匿名函数列表
    • 2.6 特殊结构匿名函数
  • 3 匿名函数的使用
    • 3.1 以匿名函数为参数
    • 3.2 调用其它文件匿名函数
    • 3.3 使用匿名函数表示隐函数
    • 3.4 绘图匿名函数

1 匿名函数的生成

1.1基础生成

(例)

f=@(x)x^2;

注:匿名函数所输入的参数可以是向量形式,只需将其中部分运算更改为点运算即可:

f=@(x)x.^2;
f(1:5)

ans =
1 4 9 16 25

也可以这么写,但除了3.3所示情况外不推荐:

f=@(x)arrayfun(@(x)x^2,x)
f(1:5)

当然eval函数cellfun,structfun等一系列常用函数也是可以在匿名函数中用到的。

同时逻辑运算对于匿名函数也成立,如下:

f=@(x)x>3&x<5

分段函数:

f=@(x)(x>3)*5+(x<=3)*4

1.2 多参数匿名函数

(例)

f=@(x,y)x^2+y;

1.3 含定参匿名函数

详见2.4部分
(例)

a=5;
f=@(x)a*x^2;

注意,即使在后来改变a的值函数f内的a也不会改变,例:

a=5;
f=@(x)a*x^2;
a=1;
f(2)

ans=20,注意此处求得数值为20 而不是4
此时若是存储该匿名函数,例:

a=5;
f=@(x)a*x^2;
save func1.mat f;

此时存储的匿名函数仍旧是包含参数的,可以通过以下两种方式使用:

load('func1.mat')
f(2)
func=load('func1.mat');
func.f(2)

1.4 sym转匿名函数

sym格式的公式可通过如下方式生成匿名函数(第一种较慢)

syms x
a=x^2+x;
f=matlabFunction(a)

a=sym(x^2+x);
f=matlabFunction(a)

1.5 字符串转匿名函数

方式如下:

a='@(x) x^2+2*x';
b=str2sym(a);
f=matlabFunction(b)

注:MATHWORK近期又出了str与句柄的转换函数,
比较新的版本可用下面的方式:

str='@(x)7*x-13';
fh=str2func(str)

1.6 函数工厂(匿名函数的自动生成)

1.6.1 已知参数个数

在一些项目中,需要根据不同参数生成不同匿名函数,
例如下面为a,b,c三个参数不同时能够自动生成不同匿名函数的生成函数:

方式一(借助sym):

function func=funcFactory(a,b,c)syms xfunc=matlabFunction(a*x^2+b*x+c);
end

方式二(借助字符串):

function func=funcFactory(a,b,c)str=['@(x)',num2str(a),'*x^2+',num2str(b),'*x+',num2str(c )];func=matlabFunction(str2sym(str));
end

使用方式:

funcFactory(1,2,3)

ans =
包含以下值的 function_handle:
@(x)x.*2.0+x.^2+3.0

1.6.2 未知参数个数

未知参数个数其变量可以设置为
x1,x2,x3…xn或者
v1,v2,v3…vn这样的形式

如下为一不固定长度的函数生成其,其中v为不定长度的参数

function func=funcFactory(v)
f=0;
for i=1:length(v)xn=str2sym(['x',num2str(i)]);f=f+v(i)*xn;
end
func=matlabFunction(f);
end

使用方式:

funcFactory([1 2 3 4 3])

ans =
包含以下值的 function_handle:
@(x1,x2,x3,x4,x5)x1+x2.*2.0+x3.*3.0+x4.*4.0+x5.*3.0

当然由于syms变量可以向量化生成,该例子显然也可以向量化:

function func=funcFactory(v)
f=sym('x',[1,length(v)]);
f=f*v';
func=matlabFunction(f);
end

1.7 拟合结果转匿名函数

(例)

x=[2 2.5 3 3.5 4 4.5 5 5.5 6];
y=[41 38 34 32 29 28 25 22 20];
p=polyfit(x,y,3);
f=matlabFunction(poly2sym(p ))

f =
包含以下值的 function_handle:
@(x)x.(-8.57e+2./5.4e+1)+x.2.*(2.56e+2./9.9e+1)-x.3.(5.8e+1./2.97e+2)+7.05e+2./1.1e+1

1.8 匿名函数的引用

如下所示f2为f1的倒函数

f1=@(x)x^2;
f2=@(x)1/f1(x)
f2(2)

与前面定参匿名函数相似,此处f1也可被看作固定参数,即使之后改变也不会对f2造成影响

1.9 匿名函数的传递

可以将匿名函数像是变量一样传递:

f1=@(x)x.*2+x.^3;f2=f1;
f2(2)

ans = 12

1.10 无参数匿名函数

(例)

e=@()exp(1);
e()
t=@()datestr(now);
t()

ans =
2.7183
\,
ans =
‘04-Mar-2021 20:18:30’

1.11 可变长度输入参数列表

想不到叭varargin这玩意也能用

f1=@(varargin)length([varargin{:}]);
f1({'slandarer',[1,2;3,4],5})

ans = 3

1.12 多返回值匿名函数

使用deal函数分发输出即可:

f=@(x)deal(x^2,x^3)
[a,b]=f(3)

f =
包含以下值的 function_handle:
@(x)deal(x2,x3)
\,
a =
9
\,
b =
27

1.13 命名函数转化为匿名函数

其实这么名称不够严谨,应该叫函数句柄对命名函数的复制

fsum=@ mysum
fsum(1,2)
function c=mysum(a,b)c=a+b;
end

fsum =
包含以下值的 function_handle:
@mysum
\,
ans =
3


2 匿名函数的结构

2.1 匿名函数数组

f={@(x)x^2;@(x)3*x;@(x)x^x}
f{1}(2)

f =
3×1 cell 数组
{@(x)x^2}
{@(x)3*x}
{@(x)x^x}
\,
ans =
4

2.2 匿名函数结构体

func.f1=@(x)x^2;
func.f2=@(x)3*x;
func.f3=@(x)x^x

调用方式:

func.f1(2)
func.('f1')(2)

func =
包含以下字段的 struct:
f1: @(x)x^2
f2: @(x)3*x
f3: @(x)x^x
\,
ans =
4

2.3 匿名函数的非标量结构体数组

func(1).f=@(x)x^2;
func(2).f=@(x)3*x;
func(3).f=@(x)x^x;func(1).f(2)

ans =
6

2.4 functions函数使用

functions函数可以获取匿名函数信息,对于1.3中的例子来说

a=5;
f=@(x)a*x^2;coe=functions(f)
coe.workspace{1}

coe =
包含以下字段的 struct:
function: ‘@(x)a*x^2’
type: ‘anonymous’
file: ‘E:\bin\匿名函数\Untitled.m’
workspace: {[1×1 struct]}
within_file_path: ‘’

ans =
包含以下字段的 struct:
a: 5

可以发现a是被存在函数信息中的
同样对于1.8的例子来说:

f1=@(x)x^2;
f2=@(x)1/f1(x);
coe=functions(f2)
coe.workspace{1}

coe =
包含以下字段的 struct:
function: ‘@(x)1/f1(x)’
type: ‘anonymous’
file: ‘E:\bin\匿名函数\Untitled2.m’
workspace: {[1×1 struct]}
within_file_path: ‘’

ans =
包含以下字段的 struct:
f1: @(x)x^2

2.5 局部命名函数的匿名函数列表

localfunctions函数能够获取该m文件文件所有function创建函数,并构建匿名函数列表:

fh=localfunctionsfunction y=f1(x)
y=sqrt(x)+x^2;
endfunction y=f2(x)
y=sqrt(x)+cos(x);
endfunction y=f3(x)
y=sqrt(x)+sin(x);
end

fh =
3×1 cell 数组
{@f1}
{@f2}
{@f3}

2.6 特殊结构匿名函数

将各种结构组合起来能够得到一些很有意思的写法:
注:此2.6节源自知乎大佬Falccm

https://www.zhihu.com/question/45621009/answer/99714353

递归匿名函数(斐波那契数列):
通过定义一个匿名函数数组,再用另一个匿名函数在不同条件下调用该数组的不同部分,就能实现在不陷入无限递归的情况下进行递归调用:

f={@(f,n)1 @(f,n)f{(n>3)+1}(f,n-1)+f{(n>4)+1}(f,n-2)};
fib=@(n)f{(n>2)+1}(f,n);
fib(20)

ans =
6765

匿名if函数:
巧用varargin函数

iff = @(varargin)varargin{find([varargin{1:2:end}],1)*2};x = 3;iff(x<1,1,x<2,2,x<3,3,x<4,4,x<5,5)

ans =
4


3 匿名函数的使用

3.1 以匿名函数为参数

f1=@(x,y)max(x);
opt(f1,1,2)
function c=opt(f,a,b)
c=f(a,b);
end

注下面的写法不适用于匿名函数,仅适用于function建立的函数

f1=@(x,y)max(x);
opt('f1',1,2)
function c=opt(f,a,b)
c=f(a,b);
end

3.2 调用其它文件匿名函数


3.3 使用匿名函数表示隐函数

例如有一隐函数:
(ey+xy)1y−x2y=0(e^y+x^y)^{\frac{1}{y}}-x^2y=0 (ey+xy)y1​−x2y=0
可将其用匿名函数表示为:

y=@(x)fzero(@(y)(exp(y)+x^y)^(1/y)-x^2*y,1);y(1)

ans =
2.7779

这种写法每次只能输入一组变量,要进行向量运算,需要使用arrayfun辅助,写作如下格式:

Y=@(x)arrayfun(@(xx)fzero(@(y)(exp(y)+xx^y)^(1/y)-xx^2*y,1),x);Y(1:5)

ans =
2.7779 1.1055 0.7759 0.6284 0.5425

3.4 绘图匿名函数

还有一些奇奇怪怪的用法,例如。。。。绘图

x=-2:0.1:2;y=-2:0.1:2;
f=@(x,y)plot(x,y.^2);
f(x,y)

多个绘图命令用中括号括起来并用分号隔开:

x=-2:0.1:2;y=-2:0.1:2;
f=@(x,y)[plot(x,y.^2,'-o','LineWidth',1.8);title('x^2','FontSize',14);xlabel('x','FontSize',13)];
f(x,y)

MATLAB 匿名函数详解(超级全面)相关推荐

  1. 匿名函数python_基于python内置函数与匿名函数详解

    内置函数 Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next() slice() any() d ...

  2. java的匿名函数_JAVA语言中的匿名函数详解

    本文主要向大家介绍了JAVA语言中的匿名函数详解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 一.使用匿名内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: ...

  3. Matlab fplot函数详解

    Matlab之fplot函数详解 功能:绘制表达式或函数 语法: fplot(f) fplot(f,xinterval) fplot(funx,funy) fplot(funx,funy,tinter ...

  4. Javascript进阶:匿名函数详解

    匿名函数:意如其名,就是没有名字的函数. function (arg1,arg2){..... } 匿名函数的普遍用法: 1.赋值给变量: var func=function(arg1,arg2){. ...

  5. python 闭包中的匿名函数详解!

    匿名函数 孔子曰:温故而知新,可以为师矣. 天若有情天亦老,人间正道是沧桑. Python–lambda表达式 lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就 ...

  6. C# 匿名函数 详解

    文章目录[点击展开](?)[+] 匿名函数的定义和用途 两种匿名函数 C委托的发展 C 10 C 20 C 30 从 C 10 到 C 30委托示例 Unity支持C30的lambda MSDN委托文 ...

  7. Python中匿名函数详解

      匿名函数是指没有名字的函数,应用在需要一个函数,但是又不想费神去命名这个函数的场合.通常情况下,这样的函数只使用一次.在Python中,使用 lambda 表达式创建匿名函数,其语法格式如下: r ...

  8. mapminmax函数 matlab,matlab mapminmax函数详解

    几个要说明的函数接口: [Y,PS] = mapminmax(X) [Y,PS] = mapminmax(X,FP) Y = mapminmax('apply',X,PS) X = mapminmax ...

  9. Matlab xcorr函数详解

    Matlab提供了计算互相关和自相关的函数xcorr函数 1.使用方法 c = xcorr(x,y) c = xcorr(x) c = xcorr(x,y,'option') c = xcorr(x, ...

最新文章

  1. Fiddler抓包1-抓firefox上https请求
  2. 部署安装kubernetes client-python,执行pip install setup.py时报错
  3. python程序填空题参照代码模板、完善代码_python二级考试操作题11.pdf
  4. 面试官系统精讲Java源码及大厂真题 - 17 并发 List、Map源码面试题
  5. 从零开始学前端:作用域、执行顺序 --- 今天你学习了吗?(JS:Day9)
  6. 201521123060 《Java程序设计》第12周学习总结
  7. ASP人事工资管理系统毕设
  8. MyISAM如何查看哪个session持有表锁
  9. 2.3谨慎活跃问题(Beware of Liveness Problems)
  10. 超级好用的网站整站下载工具
  11. 企业微信页面在电脑端进行调试的方法
  12. C/C++软件工程师就业求职手册学习笔记---第五章
  13. DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection翻译
  14. unity scripting backend mono vs il2cpp
  15. OHS简单安装与系统配置
  16. 第五章——树(数据结构)
  17. Android源码下载教程
  18. java基础-RSA签名验签
  19. github.io 公共博客
  20. vue+echarts实现3d地图——引入3d地图,加点,加点击事件

热门文章

  1. 自学python书籍推荐,请多多列举?
  2. java原始类型排序_海牛部落 java 系列教程:(5)数组和排序
  3. android注册选择国家设计师,设计师的职业资格认证,现已开通申请!
  4. java 配置jmx 参数_tomcat jmx配置
  5. sql group_concat函数
  6. google 所提供的各种服务
  7. 信息贩卖黑色产业链猖獗,大数据时代谁给隐私上锁!
  8. Kotlin直接执行kt文件方法
  9. JAVA四大排序介绍
  10. 网站页面建设(制作头部)