具有通用函数成员的结构数组?
Array of structs with generic function members?
我正在尝试构造一个结构数组,其中每个实例都包含不同的函数。我想将它们添加到循环中的数组中。
这是一个例子:
struct mystruc{F}
σ::F
end
a = [mystruc(relu)]
for i in 1:3
append!(a, [mystruc(identity), ])
end
附带说明一下,我可以选择预分配数组,我只是不知道如何处理这种类型的结构。
每个函数都有一个类型,它是那个函数独有的:
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 该数组将包含 mystruc
和 any 函数:
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"())
我正在尝试构造一个结构数组,其中每个实例都包含不同的函数。我想将它们添加到循环中的数组中。
这是一个例子:
struct mystruc{F}
σ::F
end
a = [mystruc(relu)]
for i in 1:3
append!(a, [mystruc(identity), ])
end
附带说明一下,我可以选择预分配数组,我只是不知道如何处理这种类型的结构。
每个函数都有一个类型,它是那个函数独有的:
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 该数组将包含 mystruc
和 any 函数:
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"())