Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 我可以在匿名函数中重用表达式的结果吗?_Matlab_Anonymous Function - Fatal编程技术网

Matlab 我可以在匿名函数中重用表达式的结果吗?

Matlab 我可以在匿名函数中重用表达式的结果吗?,matlab,anonymous-function,Matlab,Anonymous Function,我有一个匿名函数,比如@(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 或者这只能用普通函数编程吗?如果你对嵌套匿名函数的想法倾向于“没有中间步骤的单个匿名函数中的所有内容”(即中间匿名函数),我想不

我有一个匿名函数,比如
@(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

或者这只能用普通函数编程吗?

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

%原始函数
原点=@(x)sqrt(x)+1./sqrt(x)-3;
%复杂的内部函数
内部=@(x)sqrt(x);
%实际功能
func=@(y)y+1./y-3;
%函数包装器
包装器=@(z)func(内部(z));
%一些小测试
X=1:10;
原点(X)
包装器(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
复杂的内部函数只需要计算一次——至少在我看来是这样。

是的,你可以这样做(尽管可能会引起争论)

本质上,您需要定义一个内部匿名函数,然后使用一些昂贵的函数调用的结果立即对其求值

MATLAB处理在匿名函数定义中定义匿名函数的过程,与语法允许的方式完全相同。“立即评估”位可以使用
feval

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

一句话:我想把它也用于代码生成(嵌入式编码器),所以我必须看看嵌入式编码器支持哪些解决方案。你知道
fsolve
需要一个函数句柄,但它不需要是匿名函数。您可以编写一个实际的函数,将其粘贴在使用它的M文件的末尾,并向其传递句柄。