Octave 中定义了一个函数句柄,如下例所示。
f = @sin;
从现在开始,调用函数f(x)
与调用sin(x)
效果相同。到目前为止,一切都很好。我的问题始于我的一项编程作业中的以下函数。
function sim = gaussianKernel(x1, x2, sigma)
上面的行表示函数 gaussianKernel
的标题。这需要三个变量作为输入。但是,下面的调用让我很困惑,因为它只传递了两个变量,然后在引用 gaussianKernel
时传递了三个变量。
model = svmTrain(X, y, C, @(x1, x2) gaussianKernel(x1, x2, sigma));
不应该是 model = svmTrain(X, y, C, @gaussianKernel(x1, x2, sigma));
吗?有什么区别?
最佳答案
你没有提供周围的代码,但我的猜测是变量 sigma
在调用 model = svmTrain(X, y, C, @(x1 , x2) gaussianKernel(x1, x2, sigma));
.这是一个 parametrized anonymous function 的例子捕获当前范围内变量的值。这也称为 closure .看起来 Matlab 有 better documentation对于这个非常有用的编程模式。
函数句柄@gaussianKernel(x1, x2, sigma)
等同于@gaussianKernel
。如果需要 svmTrain
的第四个参数,则使用 model = svmTrain(X, y, C, @gaussianKernel(x1, x2, sigma));
在这种情况下可能不起作用成为具有两个输入参数的函数。
关于matlab - Octave 中的函数句柄格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45887813/