【问题标题】:Call functions with @() in MATLAB [duplicate]在 MATLAB 中使用 @() 调用函数 [重复]
【发布时间】:2014-07-26 01:01:40
【问题描述】:

我试图弄清楚以下代码 sn-p 中 @(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);

我会很感激一些解释。提前致谢

【问题讨论】:

标签: matlab


【解决方案1】:

让我回答您的问题,重点关注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" 并将其视为一个函数(尽管它的功能受到单行代码的限制-您不能执行诸如switchfor 之类的事情容易地)。

有时我们需要将一些功能包装成一个更易于使用的功能。考虑一个例子,我们想要评估 foo 1000 次,但只输入 x 变化,而 ab 保持不变。在for循环中写foo(x, 1, 2)当然是可以的,但是你也可以在进入循环之前包装函数。

a = 1;
b = 2;
foobar = @(x) foo(x, a, b); 

当您调用foobar(5) 时,Matlab 首先调用函数句柄foobar,将5 作为其唯一输入。该函数句柄有一条指令:调用另一个名为foo 的函数(或函数句柄,如果你这样定义的话)。 foo的参数为:x,在用户调用foobar(x)时定义; ab,它们在函数句柄定义代码执行之前首先被定义。

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

【讨论】:

  • 很好的解释 Yvon,非常感谢!
【解决方案2】:

这是什么。

@(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 课程。希望对你有帮助。。

如果我错了,请纠正我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-26
    • 2012-10-29
    • 2015-04-08
    • 1970-01-01
    • 2018-07-30
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多