MATLAB 函数句柄和参数
MATLAB function handles and parameters
当我在 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));
函数句柄是 MATLAB 中 parametrize functions 的一种方式。从文档页面,我们找到以下示例:
b = 2;
c = 3.5;
cubicpoly = @(x) x^3 + b*x + c;
x = fzero(cubicpoly,0)
这导致:
x =
-1.0945
那么这里发生了什么? fzero
是所谓的 函数 function,它将函数句柄作为输入,并对它们执行操作——在这种情况下,找到给定函数的根。实际上,这意味着 fzero
决定输入参数 x
到 cubicpoly
尝试使用哪些值来找到根。这意味着用户只需提供一个函数 - 无需提供输入 - fzero
将使用 x
的不同值查询函数以最终找到根。
您询问的函数 gmres
以类似的方式运行。这意味着您只需要提供一个函数,该函数接受适当数量的输入参数,gmres
将负责使用适当的输入调用它以产生其输出。
最后,让我们考虑一下您提出的调用 gmres
的建议如下:
x1 = gmres(@(y)afun(x,n),b,10,tol,maxit,@(y)mfun(x,n));
这可能有效,也可能无效——这取决于您在函数的工作区中是否有一个名为 x
的变量,最终调用 afun
或 mfun
.请注意,现在函数句柄接受一个输入,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.
当我在 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));
函数句柄是 MATLAB 中 parametrize functions 的一种方式。从文档页面,我们找到以下示例:
b = 2;
c = 3.5;
cubicpoly = @(x) x^3 + b*x + c;
x = fzero(cubicpoly,0)
这导致:
x =
-1.0945
那么这里发生了什么? fzero
是所谓的 函数 function,它将函数句柄作为输入,并对它们执行操作——在这种情况下,找到给定函数的根。实际上,这意味着 fzero
决定输入参数 x
到 cubicpoly
尝试使用哪些值来找到根。这意味着用户只需提供一个函数 - 无需提供输入 - fzero
将使用 x
的不同值查询函数以最终找到根。
您询问的函数 gmres
以类似的方式运行。这意味着您只需要提供一个函数,该函数接受适当数量的输入参数,gmres
将负责使用适当的输入调用它以产生其输出。
最后,让我们考虑一下您提出的调用 gmres
的建议如下:
x1 = gmres(@(y)afun(x,n),b,10,tol,maxit,@(y)mfun(x,n));
这可能有效,也可能无效——这取决于您在函数的工作区中是否有一个名为 x
的变量,最终调用 afun
或 mfun
.请注意,现在函数句柄接受一个输入,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.