gpt4 book ai didi

matlab - 为迭代函数组合定义泛型函数

转载 作者:太空宇宙 更新时间:2023-11-03 19:28:24 24 4
gpt4 key购买 nike

让我们定义任何函数句柄foo:

foo = @(x) x*2

我正在尝试编写生成 n-th functional power 的通用函数 defFun函数 foo 的调用,即 foon 次迭代调用,在某种程度上它可以存储在另一个句柄函数 boo,像这样:

boo = defFun(foo,n)

例如,

foo = @(x) x^2;  
boo = defFun(foo,3);

boo(3) 将给出 6561 [== foo(foo(foo(3)))]boo(2)将给出 256 [== foo(foo(foo(2)))]

我尝试用这段代码编写 defFun 但这些句柄很难处理。有什么想法吗?

function boo = defFun(foo,n)
h = foo;
for i=2:n
h = h(h);
end
boo = h
end

最佳答案

我的代码与您的原始代码非常相似。我冒昧地重命名了一些变量。

直接方法:

对于单输入和单输出参数,您可以使用类似于您的代码的直接方法:

function ftoN = fIterate(f, N)
ftoN = f;
for i = 2:N
ftoN = @(x) f(ftoN(x));
end
end

间接方法:(可能更快)

这个会快很多,它也适用于多个(但相同数量的)输入和输出。

function ftoN = fIterate(f, N)
ftoN = @(varargin) fIterateLocal(f, N, varargin{:});
function varargout = fIterateLocal(f, N, varargin)
varargout = varargin;
for i = 1:N
[varargout{1:nargin-2}] = f(varargout{:});
end
end
end

示例:

这两种方法都适用于此:

square = @(x) x^2;
square(2)
>> ans = 4

squaresquaresquare = fIterate(square, 3)
squaresquaresquare(3)
>> ans = 6561

后果:

直接方法会相当慢,而且还受到 MATLAB 的最大递归限制的限制。

timeit(@()feval(fIterate(@(X)X+1,400),0))
ans = 1.2160

间接方法会给你更多的速度和灵 active :

timeit(@()feval(fIterate(@(X)X+1,400),0))
ans = 0.0072

关于matlab - 为迭代函数组合定义泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27765598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com