MATLAB函数句柄和参数

时间:2016-04-11 17:58:01

标签: matlab anonymous-function function-handle

当我在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一样写这样的话:( y在@handle中

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

1 个答案:

答案 0 :(得分: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.