我正在尝试构造一个结构数组,其中每个实例包含一个不同的函数。我想将它们循环添加到数组中。
这是一个例子:
struct mystruc{F}
σ::F
end
a = [mystruc(relu)]
for i in 1:3
append!(a, [mystruc(identity), ])
end
作为旁注,我可以选择预分配我无法弄清楚如何使用这种类型的结构的数组。
答案 0 :(得分:4)
每个函数都有一个类型,该类型是那个函数专有的:
julia> typeof(x -> x) == typeof(x -> x)
false
这里我们两次创建了函数x -> x
,它们是两个不同的函数,因此它们的类型不同。
在a
的构造中,您将创建一个特定类型的数组:
julia> a = [mystruc(relu)]
1-element Array{mystruc{typeof(relu)},1}:
mystruc{typeof(relu)}(relu)
julia> typeof(a)
Array{mystruc{typeof(relu)},1}
因此,当您按下另一个函数时,会出现错误,因为此数组只能包含类型为mystruc{typeof(relu)}
的对象。
julia> push!(a, mystruc(x -> 2x))
ERROR: MethodError: Cannot `convert` an object of type
mystruc{var"#3#4"} to an object of type
mystruc{typeof(relu)}
Closest candidates are:
convert(::Type{T}, ::T) where T at essentials.jl:171
mystruc{typeof(relu)}(::Any) where F at REPL[2]:2
构造a
时,请告诉Julia使用 any 函数的数组将包含mystruc
:
julia> a = mystruc{<:Function}[mystruc(relu)]
现在可以使用了!
julia> push!(a, mystruc(x -> 2x))
2-element Array{mystruc{#s1} where #s1<:Function,1}:
mystruc{typeof(relu)}(relu)
mystruc{var"#5#6"}(var"#5#6"())