matlab - 我可以在匿名函数中重用表达式的结果吗?
问题描述
我有一个匿名函数@(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
?
还是只能使用正常功能进行编程?
解决方案
如果您对嵌套匿名函数的想法进入“没有中间步骤的单个匿名函数中的所有内容”(即中间匿名函数)的方向,我想不出解决方案,因为您必须以某种方式将值“存储”到防止其重新计算。所以,我的想法如下:
% 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
复杂的内部函数只被评估一次——至少从我的角度来看是这样。
推荐阅读
- visual-studio - Visual Studio 可以对源代码中的 XML 字符串执行静态分析吗?
- java - mapstruct 将方法应用于列表中的所有对象
- javascript - 使用 CSP 从 analytics.js 迁移到 gtag.js
- wordpress - 在 WooCommerce 购物车中设置全球最低金额,但类别餐饮 + 子类别除外
- javascript - 如何使用jQuery比较每个数组编号?如果小于输入范围数 div 标签将隐藏
- julia - 可以用对字段维度的持久要求来定义 julia 结构吗?
- spring-boot - 依赖 spring-boot-starter-webflux 时发生 reactor.netty 错误
- r - 如何使用具有三个水平的 x 变量和比例不相关的二分 y 变量创建条形图
- r - 从日期开始的月、日、小时、分钟、秒的子集
- sqlite - 如何根据人数动态配置时段