在MATLAB中使用@()调用函数

时间:2014-07-26 01:01:41

标签: matlab

我试图弄清楚以下代码片段中@(t)的用途是什么:

 [theta] = ...
     fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), ...
             initial_theta, options);

lrCostFunction:

function [J, grad] = lrCostFunction(theta, X, y, lambda)
%LRCOSTFUNCTION Compute cost and gradient for logistic regression with 
%regularization
%   J = LRCOSTFUNCTION(theta, X, y, lambda) computes the cost of using
%   theta as the parameter for regularized logistic regression and the
%   gradient of the cost w.r.t. to the parameters. 

和选项:

options = optimset('GradObj', 'on', 'MaxIter', 50);

我很欣赏一些解释。提前致谢

2 个答案:

答案 0 :(得分:2)

让我回答你关注anonymous function本身的问题。

以下函数,在单独的.m文件中定义

function y = foo(x, a, b)
    y = x^(a-b);
end

相当于在主脚本中定义匿名函数

bar = @(x, a, b) x^(a-b);

当主脚本调用函数foo(5, 1, 2)时,Matlab在工作目录中搜索,然后读取并执行文件foo.m中的代码。相反,当你运行一行bar(5, 1, 2)时,Matlab会调用一个"function handle"并将其视为一个函数(虽然它的功能受到一行代码的限制 - 你不能执行像{{1}这样的事情。或者switch很容易)。

有时候我们需要将一些功能包装成一个更容易使用的功能。考虑一种情况,我们要评估for 1000次,但只输入foo次更改,而xa保持不变。在b循环中编写foo(x, 1, 2)当然可以,但您也可以在进入循环之前包装该函数。

for

当您致电a = 1; b = 2; foobar = @(x) foo(x, a, b); 时,Matlab首先调用函数句柄foobar(5),将foobar作为唯一输入。该函数句柄有一条指令:调用名为5的另一个函数(或函数句柄,如果你定义它)。 foo的参数是:foo,在用户调用x时定义; foobar(x)a,它们是在执行函数句柄定义代码之前首先定义的。

在您的情况下,b仅接受一个只有一个输入参数的函数作为其第一个参数。但是fmincg需要四个。 lrCostFunction不知道如何对待fmincgxy(我也不知道)。因此,将成本函数包装到一般优化器可以理解的形式中是您的工作。这还要求您提前分配lambdaxyc

答案 1 :(得分:1)

它是什么。

@(t)创建一个带有参数t的函数,调用你的costFunction(t,X,y),如果你写的话

fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), ...
             initial_theta, options);

它将调用您的函数lrCostFunction并传递值

为什么我们需要它

它允许我们使用Octave提供的内置优化功能(因为MATLAB没有fminc功能AFAIK )。因此,它需要您的costFunction并使用您提供的设置进行优化。

优化设置

optimset('GradObj', 'on', 'MaxIter', 50);允许您设置上面提到的最小化问题所需的优化设置。

所有信息均来自Andrew NG课程。我希望它有所帮助..

如果我错了,请纠正我。