首页 > 解决方案 > 我可以在匿名函数中重用表达式的结果吗?

问题描述

我有一个匿名函数@(x) sqrt(x) + 1./sqrt(x) - 3,我想传递给另一个函数,例如

fsolve(@(x) sqrt(x) + 1./sqrt(x) - 3, 3)

想象一下, 的参数sqrt有点复杂,因此sqrt(...)计算的调用很繁重 - 是否可以创建一个匿名函数,sqrt(x)首先计算(在这个简单的例子中),然后使用结果res来计算res + 1/res - 3

还是只能使用正常功能进行编程?

标签: matlabanonymous-function

解决方案


如果您对嵌套匿名函数的想法进入“没有中间步骤的单个匿名函数中的所有内容”(即中间匿名函数)的方向,我想不出解决方案,因为您必须以某种方式将值“存储”到防止其重新计算。所以,我的想法如下:

% Original function
orig = @(x) sqrt(x) + 1./sqrt(x) - 3;

% Complicated inner function
inner = @(x) sqrt(x);

% Actual function
func = @(y) y + 1./y - 3;

% Function wrapper
wrapper = @(z) func(inner(z));

% Some small tests
X = 1:10;
orig(X)
wrapper(X)

ans =
  -1.000000  -0.878680  -0.690599  -0.500000  -0.316718  -0.142262   0.023716   0.181981   0.333333   0.478505

ans =
  -1.000000  -0.878680  -0.690599  -0.500000  -0.316718  -0.142262   0.023716   0.181981   0.333333   0.478505

复杂的内部函数只被评估一次——至少从我的角度来看是这样。


推荐阅读