Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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_Functional Programming_Anonymous Function_Currying - Fatal编程技术网

MATLAB中逐次函数的应用

MATLAB中逐次函数的应用,matlab,functional-programming,anonymous-function,currying,Matlab,Functional Programming,Anonymous Function,Currying,如何使用匿名函数在MATLAB中进行连续函数应用?如下所示: g = @(x) @(y) x+y; g(1)(2) 但是,MATLAB在第2行给出了一个错误:()-索引必须在索引表达式中最后出现 但以下工作: g = @(x) @(y) x+y; f = g(1); f(2) 上面的脚本输出ans=3 我不太熟悉MATLAB,但我认为在函数级操作的能力使编程更容易。例如,当我需要计算函数在L^2的某个子空间上的投影时,投影运算符和规范化等。所有输出函数都需要附加参数来计算数值答案。MATLA

如何使用匿名函数在MATLAB中进行连续函数应用?如下所示:

g = @(x) @(y) x+y;
g(1)(2)
但是,MATLAB在第2行给出了一个错误:()-索引必须在索引表达式中最后出现

但以下工作:

g = @(x) @(y) x+y;
f = g(1);
f(2)
上面的脚本输出ans=3


我不太熟悉MATLAB,但我认为在函数级操作的能力使编程更容易。例如,当我需要计算函数在L^2的某个子空间上的投影时,投影运算符和规范化等。所有输出函数都需要附加参数来计算数值答案。

MATLAB不支持对函数返回的函数句柄进行单表达式调用,如
y=g(1)(2)
。但是,您可以通过使用临时变量绕过此限制:

g1 = g(1); 
y = g1(2);
作为替代方案,您可以构建自己的函数来包装此功能

递归方法可以是:

function f = fevalIterated(f, varargin)
if ~isempty(varargin)
    f = fevalIterated(f(varargin{1}), varargin{2:end});
end
您将调用
y=fevalited(g,1,2)
,而不是
y=g(1)(2)

执行此操作的迭代方法可能更快:

function f = fevalIterated(f, varargin)
for i = 1:numel(varargin)
    f = f(varargin{i});
end
当您询问MATLAB中的咖喱概念时,它与此非常相似:

非咖喱 非货币化意味着将函数
@(x)@(y)@(z)x+y+z
转换为函数
@(x,y,z)x+y+z
。这是一个非常相似的概念,因此您可以重用
fevalited
的功能来构建一个函数
uncurry
,该函数可以这样使用:

g = uncurry(@(x) @(y) @(z) x+y+z);
y = g(1,2,3)
function f = curry(f,N)
for i = 1:N-1
    f = @(varargin) @(last) f(varargin{:}, last);
end
功能
uncurry
将被定义为:

function uncurried = uncurry(f)
uncurried = @(varargin) fevalIterated(f, varargin{:});
咖喱 要转换函数
@(x,y,z)x+y+z
意味着将其转换为
@(x)@(y)@(z)x+y+z

下面是
curry
的递归实现:

function f = curry(f,N)
if N>1
    f = @(first) curry(@(varargin)f(first,varargin{:}), N-1);
end
(更快的)迭代实现如下所示:

g = uncurry(@(x) @(y) @(z) x+y+z);
y = g(1,2,3)
function f = curry(f,N)
for i = 1:N-1
    f = @(varargin) @(last) f(varargin{:}, last);
end
您可以通过
f=curry(@(x,y,z)x+y+z,3)调用这两个函数

警告 虽然您可以在MATLAB中完成所有这些操作,但是如果您调用thingy的整个函数句柄过多,您可能会遭受明显的性能下降

f = @(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15) ...
     (x1+x2+x3+x4+x5+x6+x7+x8+x9+x10+x11+x12+x13+x14+x15);
%%// Currying vs Comma separated list expansion
%// Comma separated list expansion
tic;
[C{1:15}] = deal(12345);
f(C{:});
toc;
%// Elapsed time is 0.000146 seconds.

%// Currying
g = curry(f,15);
tic;
for i = 1:15
    g = g(12345);
end
toc;
%// Elapsed time is 0.015679 seconds.

我不认为你所描述的是真正的咖喱。您想知道如何计算
g(1)(2)
还是想知道如何在MATLAB中进行计算?(从函数
(X X Y)->Z生成函数
)@knedlsepp我想知道前者,即如何计算g(1)(2)。谢谢可能重复的谢谢!非常elegant@DavidYao当前位置我添加了一点关于咖喱的内容。你可能也对它感兴趣。