1

如果您不介意,请您帮助我,我怎样才能拥有 x 的功能,如下所示:

此函数计算 x 的两个值

function MOP2(x)
    n=length(x);
    z1=1-exp(sum((x-1/sqrt(n)).^2));
    z2=1-exp(sum((x+1/sqrt(n)).^2));
    z=[z1;z2];
    return z
end

在我想要的主要代码中

costfunc=F(x)

但我不知道它是否存在于 Julia 中。在matlab中我们可以有如下

costfunc=@(x)  MOP2(x)

有像@Julia 那样的功能吗?

非常感谢。

4

1 回答 1

3

是的,有一个语法。

这些被称为匿名函数(尽管您可以为它们指定一个名称)。

这里有一些方法可以做到这一点。

x -> x^2 + 3x + 9
x -> MOP2(x) # this actually is redundant. Please see the note below

# you can assign anonymous functions a name
costFunc = x -> MOP2(x)


# for multiple arguments
(x, y) -> MOP2(x) + y^2

# for no argument
() -> 99.9

# another syntax
function (x)
    MOP2(x)
end

以下是一些使用示例。

julia> map(x -> x^2 + 3x + 1, [1, 4, 7, 4])
4-element Array{Int64,1}:
  5
 29
 71
 29


julia> map(function (x) x^2 + 3x + 1 end, [1, 4, 7, 4]) 
4-element Array{Int64,1}:
  5
 29
 71
 29

请注意,您不需要创建像x -> MOP2(x). 如果一个函数接受另一个函数,你可以简单地传递MOP2而不是传递x -> MOP2(x)。这是一个例子round

julia> A = rand(5, 5);
julia> map(x -> round(x), A)
5×5 Array{Float64,2}:
 0.0  1.0  1.0  0.0  0.0
 0.0  1.0  0.0  0.0  1.0
 0.0  0.0  1.0  0.0  1.0
 1.0  1.0  1.0  1.0  0.0
 0.0  0.0  1.0  1.0  1.0

julia> map(round, rand(5, 5))
5×5 Array{Float64,2}:
 0.0  1.0  1.0  0.0  0.0
 0.0  1.0  0.0  0.0  1.0
 0.0  0.0  1.0  0.0  1.0
 1.0  1.0  1.0  1.0  0.0
 0.0  0.0  1.0  1.0  1.0

将函数作为参数传递时也do语法。

如果你想给你的匿名函数起一个名字,你不妨定义另一个函数,比如

costFunc(x) = MOP2(x) + sum(x.^2) + 4

costFunc稍后使用。

如果你想用另一个名字调用一个函数,你可以写

costFunc = MOP2

如果它在函数内部。否则。在全局范围内,最好const在赋值语句之前添加。

const constFunc = MOP2

这对于类型稳定性的原因很重要。

于 2019-05-07T11:07:28.937 回答