为什么Octave / Matlab使用函数句柄

时间:2017-05-23 22:03:38

标签: matlab functional-programming octave

特别是对待功能有什么好处?例如,

function n = f(x)
   2*x
endfunction

f(2) //outputs 4
f = @f
f(2) //outputs 4

如果句柄可以像函数一样调用,那么我们从被特殊处理的函数中获得什么好处。特别指的是,引用函数的变量不能作为参数传递:

function n = m(f,x)
   f(x)
end

m(f,2) // generates error since f is called without arguments

为什么没有像其他函数式语言那样的函数程序(总是由变量指向)?

编辑: 似乎我的问题完全被误解了,所以我会改写它。比较以下python代码

def f(x):
    return 2*x
def m(f,x):
    return f(x)
m(f,3)

到八度音码

function n = f(x)
   2*x
end
function n = m(f,x)
    f(x)
end
m(@f,2) % note that we need the @

那么我的问题是,究竟什么是函数" object"在八度?在python中,它只是一个值(函数是可以分配给变量的原始对象)。 octave / matlab从处理函数中获得的好处与所有其他函数式语言的原始对象不同有什么好处呢?

以下变量指向什么(内部结构是什么样的?)

x = 2
function n = f(x)
   2*x
end
g = @f

enter image description here

在python中,你可以简单地指定g = f(不需要与@间接)。为什么八度音也不能这样工作?他们从特殊处理函数中得到了什么(而不是原始值)?

2 个答案:

答案 0 :(得分:1)

引用函数的变量可以作为参数在matlab中传递。使用以下代码

创建名为func.m的文件
function [ sqr ] = func( x )
    sqr = x.^2;
end

创建一个名为' test.m'的文件。像这样

function [ output ] = test( f, x )
    output = f(x);
end

现在,请尝试以下

f=@func;
output = test(f, 3);

答案 1 :(得分:0)

没有“为什么会有所不同”。这是一个设计决定。这就是matlab / octave的工作原理。这与c的工作方式非常相似。

我没有任何内部工作的复杂知识,但可能只是一个函数简单地成为一个符号,可以在运行时访问并用于调用其定义中指定的指令(可以是解释或预编译的指令) 。另一方面,“函数句柄”更类似于函数指针,它就像c一样,可以用于重定向到它指向的函数,或者作为参数传递。

这允许matlab / octave完成在自己的文件中完全定义函数之类的东西,并且不需要运行/导入该文件以便将函数加载到内存中。它只需要可访问(即在路径中),并且当matlab / octave启动新会话时,它将创建可在会话中使用的可用功能/符号的适当表。而对于python,当您在文件中定义函数时,您需要“运行”/导入该文件以将函数定义加载到内存中,作为REPL会话本身中的一系列解释指令。这只是一种不同的做事方式,一种不一定比另一种更好。它们只是不同的设计/实施决策。两者都很有效。

至于matlab / octave是否适用于函数式编程/设计时考虑到函数式编程,我会说它不是我选择的函数编程语言;你可以用some interesting functional programming做它,但它不是那种为它设计的编程;它主要是考虑到科学编程而设计的,并且擅长于此。