怎么可能在 julia 中有一个变量的函数?
How is it possible to have a function of a variable in julia?
如果你不介意的话,请你帮我看看我怎样才能让 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 中是否有类似 @
的函数?
非常感谢。
是的,有一个语法。
这些称为匿名函数(尽管您可以为它们指定名称)。
这里有几种方法可以做到这一点。
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
还有the do
syntax同时传递函数作为参数
如果你想给你的匿名函数起一个名字,你还不如再定义一个函数,比如
costFunc(x) = MOP2(x) + sum(x.^2) + 4
稍后使用costFunc
。
如果你想用另一个名字调用一个函数,你可以这样写
costFunc = MOP2
如果它在函数内部。除此以外。在全局范围内,最好在赋值语句前加上const
。
const constFunc = MOP2
出于 type-stability 的原因,这很重要。
如果你不介意的话,请你帮我看看我怎样才能让 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 中是否有类似 @
的函数?
非常感谢。
是的,有一个语法。
这些称为匿名函数(尽管您可以为它们指定名称)。
这里有几种方法可以做到这一点。
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
还有the do
syntax同时传递函数作为参数
如果你想给你的匿名函数起一个名字,你还不如再定义一个函数,比如
costFunc(x) = MOP2(x) + sum(x.^2) + 4
稍后使用costFunc
。
如果你想用另一个名字调用一个函数,你可以这样写
costFunc = MOP2
如果它在函数内部。除此以外。在全局范围内,最好在赋值语句前加上const
。
const constFunc = MOP2
出于 type-stability 的原因,这很重要。