这篇不是讲专门的讲这个函数的用法,而是讲一下初次看这个函数的时候遇到的一些疑问。
@
首先,我想先从 @ 开始讲起。
@ 一共有两个作用。
匿名函数中的应用
1 2 3 4 5 6 7
| 变量名=@(输入参数列表)运算表达式 例如计算一个数的平方可以写成如下格式: mysqr=@(x)x.*x; %第一个(x)为输入的参数,而后面x.*x则为数学意义上的x^2; 执行mysqr(变量名) 即可完成平方计算。例如: mysqr(2) ans = 4
|
作为自定义函数的指针(句柄)
1 2 3 4 5 6 7 8 9
| 我们定义一个这样的m文件:
f.m: function y=f(x) y=cos(x); 则可以定义mycos = @f 来调用已定义函数。 并通过 mycos(pi)来使用该函数。 返回 ans = -1
|
下面我们来具体讲一下细节方面的展现。
Example1
我们先定义一个文件 test1.m
test1.m
1 2 3
| function[jval,grad] = test1(theta); ... ...
|
定义一个 test2.m
1 2 3 4 5 6 7
| ... ... option1 = optimset('GradObj','on','MaxIter','40'); initalthrta = zeros(2,1); [optTheta,functionVal,ExitFlag] = fminunc(@test1,initalthrta,option1); ... ...
|
Example2
定义一个文件 lrCostFunction.m
1 2 3
| function [J, grad] = lrCostFunction(theta, X, y, lambda) ... ...
|
在定义一个文件
1 2 3 4 5 6 7
| ... ... initial_theta = zeros(n + 1, 1); options = optimset('GradObj', 'on', 'MaxIter', 50); [theta] = fmincg(@(t)(lrCostFunction(t, X, (y==k), lambda)), initial_theta, options); ... ...
|
可以看出 example1 和 example2 最为突出的不同在于 t。
先在这里贴一张图,函数之间的对应关系。
可以看出,我们在 example2 中,第一个 t 只是一个传参,代表的是后面括号里面的函数,第二个 t 也只是象征性的写法,这是由 fmincg 这个方法特性所决定的,我之所以讲不清楚,因为我也是一知半解,但即便是这样,运用它已经不是问题了。