外观
Matlab 函数句柄
在 Matlab 中,函数名前面加 @,例如:
f = @sin;这里的 f 不是 sin 的计算结果,而是一个函数句柄。可以理解成“指向某个函数的变量”。之后调用
f(pi/2)就等价于
sin(pi/2)函数句柄最常见的用途,是把函数当成参数传给另一个函数,或者保存到结构体里。比如 iFEM 里的 Poisson 测试数据常写成:
pde = struct('f', @f, 'exactu', @exactu, 'g_D', @g_D, 'Du', @Du);这行代码创建了一个结构体:
pde.f = @f;
pde.exactu = @exactu;
pde.g_D = @g_D;
pde.Du = @Du;其中 f、exactu、g_D、Du 可以在同一个文件后面定义成局部函数或嵌套函数。虽然函数定义写在后面,但 Matlab 会解析整个函数文件,所以前面可以先用 @f 创建句柄。
之后求解器不需要知道具体测试问题是什么,只要调用:
rhs = pde.f(p);
u = pde.exactu(p);
du = pde.Du(p);这样同一个有限元求解器就可以处理不同的 PDE 数据。换一个问题时,只需要换一个 pde 结构体,而不用改求解器本身。
除了指向已有函数,Matlab 也可以直接创建匿名函数:
g = @(x) x.^2 + 1;这里 @(x) 表示这个函数的输入参数是 x。调用
g(3)得到 10。
多个参数也可以这样写:
h = @(x, y) x.^2 + y.^2;
h(3, 4)需要注意的是,@f 和 f(...) 含义不同:
@f是创建函数句柄,不会执行函数。f(...)是调用函数,会立刻计算结果。
所以在读 Matlab 代码时,可以记住:函数名前加 @,就是把函数本身作为一个值保存起来;后面加括号,才是真正调用这个函数。
版权所有
版权归属:Guisong Wu