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编写额外代码