【问题标题】:MATLAB function handles and parametersMATLAB 函数句柄和参数
【发布时间】:2016-04-11 17:58:01
【问题描述】:

当我在 MATLAB 中键入 help gmres 时,我得到以下示例:

n = 21; A = gallery('wilk',n);  b = sum(A,2);
tol = 1e-12;  maxit = 15;
x1 = gmres(@(x)afun(x,n),b,10,tol,maxit,@(x)mfun(x,n));

这两个函数分别是:

function y = afun(x,n)
    y = [0; x(1:n-1)] + [((n-1)/2:-1:0)'; (1:(n-1)/2)'].*x+[x(2:n); 0];
end

function y = mfun(r,n)
    y = r ./ [((n-1)/2:-1:1)'; 1; (1:(n-1)/2)'];
end

我对其进行了测试,效果很好。我的问题是在这两个函数中x 的价值是什么,因为我们从来没有给它一个?

gmres 的调用也不应该这样写:(@handle 中的y

x1 = gmres(@(y)afun(x,n),b,10,tol,maxit,@(y)mfun(x,n));

【问题讨论】:

  • 我认为文档很好地解释了这一点。具体来说,看看function handlesparametrizing functions
  • 我已经阅读了所有这些内容。他们没有回答我的问题。如果您阅读了我的问题,也许您可​​以回答。

标签: matlab anonymous-function function-handle


【解决方案1】:

函数句柄是 MATLAB 中parametrize functions 的一种方式。在文档页面中,我们找到了以下示例:

b = 2;
c = 3.5;
cubicpoly = @(x) x^3 + b*x + c;
x = fzero(cubicpoly,0)

导致:

x =
   -1.0945

那么这里发生了什么? fzero 是一个所谓的函数函数,它将函数句柄作为输入,并对它们执行操作——在这种情况下,找到给定函数的根。实际上,这意味着fzero 决定尝试输入参数xcubicpoly 的哪些值以找到根。这意味着用户只需提供一个函数 - 无需提供输入 - 而fzero 将使用 x 的不同值查询函数以最终找到根。

您询问的函数gmres 以类似的方式运行。这意味着您只需要提供一个接受适当数量的输入参数的函数,gmres 将使用适当的输入调用它以产生其输出。

最后,让我们考虑一下您致电gmres 的建议如下:

x1 = gmres(@(y)afun(x,n),b,10,tol,maxit,@(y)mfun(x,n));

这可能有效,也可能无效——这取决于函数的工作区中是否有一个名为x 的变量最终调用afunmfun。请注意,现在函数句柄接受一个输入,y,但它的值在定义的函数的表达式中没有使用。这意味着它不会对输出产生任何影响。

考虑下面的例子来说明发生了什么:

f = @(y)2*x+1; % define a function handle
f(1) % error! Undefined function or variable 'x'!

% the following this works, and g will now use x from the workspace
x = 42;
g = @(y)2*x+1; % define a function handle that knows about x
g(1)
g(2)
g(3) % ...but the result will be independent of y as it's not used.

【讨论】:

  • 感谢您的回答。我确实在文档页面中阅读了这个示例,但看到 fzero 找到了合适的 x。我没有意识到 gmres 以同样的方式工作。所以不需要指定 x 与 gmres 和 fzero 以这种方式工作的事实有关吗?对于您示例中的函数,您总是必须为 x 赋值?
  • 简单来说,函数句柄有自己的变量工作区。在创建函数句柄时必须知道未输入的任何内容(通过输入参数列表),并且来自定义句柄的工作区。所以这允许你做例如y=1; f = @(x)2*x+y 拥有一个使用输入 x 的单输入函数,但也知道常量参数 y 应该具有什么值。当然,这两个函数做的事情有些不同,它们使用句柄的方式在概念上是相同的——用户不向它们提供输入,函数决定它。
猜你喜欢
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
相关资源
最近更新 更多