And*_*mes 4 matlab octave function-handle
Octave中的函数句柄定义如下.
f = @sin;
Run Code Online (Sandbox Code Playgroud)
从现在开始,调用函数f(x)与调用具有相同的效果sin(x).到现在为止还挺好.我的问题从下面的一个编程任务开始.
function sim = gaussianKernel(x1, x2, sigma)
Run Code Online (Sandbox Code Playgroud)
上面的行代表函数的标题gaussianKernel.这需要三个变量作为输入.但是,下面的调用让我心烦意乱,因为它只传递了两个变量,然后传递了三个变量gaussianKernel.
model = svmTrain(X, y, C, @(x1, x2) gaussianKernel(x1, x2, sigma));
Run Code Online (Sandbox Code Playgroud)
不应该那么简单model = svmTrain(X, y, C, @gaussianKernel(x1, x2, sigma));吗?有什么不同?
你没有提供周围的代码,但我的猜测是sigma在调用之前在代码中定义了变量model = svmTrain(X, y, C, @(x1, x2) gaussianKernel(x1, x2, sigma));.它是参数化匿名函数的一个示例,它捕获当前作用域中变量的值.这也称为封闭.对于这个非常有用的编程模式,看起来Matlab有更好的文档.
函数句柄@gaussianKernel(x1, x2, sigma)相当于@gaussianKernel.model = svmTrain(X, y, C, @gaussianKernel(x1, x2, sigma));如果第四个参数svmTrain必须是具有两个输入参数的函数,则在这种情况下使用可能不起作用.