Matlab 八度音阶的函数句柄格式

Matlab 八度音阶的函数句柄格式,matlab,octave,function-handle,Matlab,Octave,Function Handle,下例定义了一个倍频程的函数句柄 f = @sin; 从现在起,调用函数f(x)与调用sin(x)具有相同的效果。到现在为止,一直都还不错。我的问题从我的一个编程作业中的以下函数开始 function sim = gaussianKernel(x1, x2, sigma) 上面的行表示函数gaussianKernel的标题。这需要三个变量作为输入。然而,下面的调用让我很困惑,因为它只传递了两个变量,然后是三个变量,而引用的是gaussianKernel model = svmTrain(X,

下例定义了一个倍频程的函数句柄

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))之前在代码中定义。它是捕获当前范围内变量值的示例。这也被称为a。看起来Matlab已经为这个非常有用的编程模式做好了准备


函数句柄
@gaussianKernel(x1,x2,sigma)
相当于
@gaussianKernel
。使用
model=svmTrain(X,y,C,@gaussianKernel(x1,x2,sigma))svmTrain
的第四个参数是具有两个输入参数的函数,则在这种情况下,
可能不起作用。

在代码中的其他地方已经定义了
sigma
变量。因此,
svmTrain
将该值从现有范围中拉出

创建匿名函数
@(x1,x2)gaussianKernel(x1,x2,sigma)
的目的是创建一个包含两个参数而不是三个参数的函数。如果查看
svmTrain
中的代码,它将接受一个参数
kernelFunction
,并且只使用两个参数调用它
svmTrain
本身与
sigma
的值无关,事实上,它只知道传递的
kernelFunction
应该只有两个参数

另一种方法是定义一个新功能:

function sim = gKwithoutSigma(x1, x2)
    sim = gaussianKernel(x1, x2, sigma)
endfunction
请注意,这必须首先在调用
svmTrain
的脚本中的某个地方定义。然后,您可以调用
svmTrain
作为:

model = svmTrain(X, y, C, @gKwithoutSigma(x1, x2))
使用匿名参数化函数可以避免在没有IGMA的情况下为
gk编写额外代码