【问题标题】:Function handle formats in OctaveOctave 中的函数句柄格式
【发布时间】:2017-08-25 18:50:08
【问题描述】:

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));吗?有什么区别?

【问题讨论】:

    标签: matlab octave function-handle


    【解决方案1】:

    你没有提供周围的代码,但我的猜测是变量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)); 可能不起作用。

    【讨论】:

      【解决方案2】:

      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))
      

      使用匿名参数化函数可以避免您为gKwithoutSigma 编写额外的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多