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 。如果需要 model = svmTrain(X, y, C, @gaussianKernel(x1, x2, sigma)); 的第四个参数是具有两个输入参数的函数,则在这种情况下使用 svmTrain 可能不起作用。

关于matlab - Octave 中的函数句柄格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45887813/

10-11 22:42