首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MATLAB中用@()调用函数

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

Stack Overflow用户
提问于 2014-07-26 01:01:40
回答 2查看 1.2K关注 0票数 1

我试图在下面的代码片段中找出@(t)的目的是什么:

代码语言:javascript
复制
 [theta] = ...
     fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), ...
             initial_theta, options);

lrCostFunction:

代码语言:javascript
复制
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. 

和备选方案:

代码语言:javascript
复制
options = optimset('GradObj', 'on', 'MaxIter', 50);

我希望你能解释一下。提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-26 18:03:34

让我回答您的问题,重点是匿名函数本身。

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

代码语言:javascript
复制
function y = foo(x, a, b)
    y = x^(a-b);
end

等于在主脚本中定义匿名函数。

代码语言:javascript
复制
bar = @(x, a, b) x^(a-b);

当主脚本调用函数foo(5, 1, 2)时,Matlab在工作目录中搜索,然后在文件foo.m中读取和执行代码。相反,当您运行一行bar(5, 1, 2)时,Matlab调用一个“功能句柄”并将其视为一个函数(尽管它的功能受到一行代码的限制--您不能轻松地执行switchfor之类的操作)。

有时,我们需要将一些功能封装成一个更易于使用的函数。考虑这样一种情况:我们希望计算foo 1000次,但只需要输入x更改,而ab则保持不变。当然,在foo(x, 1, 2)循环中编写for是可以的,但是您也可以在进入循环之前包装这个函数。

代码语言:javascript
复制
a = 1;
b = 2;
foobar = @(x) foo(x, a, b); 

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

在您的例子中,fmincg只接受一个只有一个输入参数的函数,作为它的第一个参数。但是lrCostFunction需要四个。fmincg不知道如何对待xylambda (我也不知道)。因此,您的工作是将成本函数封装到一般优化器可以理解的形式中。这也要求您预先分配xyclambda

票数 2
EN

Stack Overflow用户

发布于 2014-07-26 07:23:57

,怎么回事,

@(t)创建一个带有参数t的函数,该函数调用您的costFunction(t,X,y),因此如果您编写

代码语言:javascript
复制
fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), ...
             initial_theta, options);

它将调用函数lrCostFunction并传递值。

为什么我们需要它

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

优化设置

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

所有信息来自Andrew类。希望能帮上忙..。

如果我错了,请纠正我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24966517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档