我有一个符号代表要调用的函数的名称:
julia> func_sym = :tanh
我可以使用该符号来获取 tanh 函数并使用以下方法调用它:
julia> eval(func_sym)(2)
0.9640275800758169
但我宁愿避免那里的“eval”,因为它会被多次调用并且成本高昂(并且 func_sym 根据上下文可以有多个不同的值)。
IIRC 在 Ruby 中你可以这样说:
obj.send(func_sym, args)
朱莉娅身上有类似的东西吗?
编辑:关于为什么我有由符号表示的函数的更多细节:
我有一个包含激活函数的类型(来自神经网络),最初我将其作为函数包含在内:
type NeuralLayer
weights::Matrix{Float32}
biases::Vector{Float32}
a_func::Function
end
但是,我需要使用 JLD 将这些内容序列化为文件,但不可能序列化函数,所以我使用了一个符号:
type NeuralLayer
weights::Matrix{Float32}
biases::Vector{Float32}
a_func::Symbol
end
目前我使用上面的 eval 方法来调用激活函数。有 NeuralLayers 的集合,每个神经层都可以有自己的激活函数。
@Isaiah 的回答很准确;在编辑原始问题后,也许更是如此。为了详细说明并使之更具体地适合您的情况:我会更改您的NeuralLayer
类型为参数化:
type NeuralLayer{func_type}
weights::Matrix{Float32}
biases::Vector{Float32}
end
Since func_type
没有出现在字段的类型中,构造函数将要求您显式指定它:layer = NeuralLayer{:excitatory}(w, b)
。这里的一个限制是您不能修改类型参数。
Now, func_type
可以是一个符号(就像您现在所做的那样),也可以是一个与功能更相关的参数(或多个参数),用于调整您的激活函数。然后你定义你的激活函数,如下所示:
# If you define your NeuralLayer with just one parameter:
activation(layer::NeuralLayer{:inhibitory}) = …
activation(layer::NeuralLayer{:excitatory}) = …
# Or if you want to use several physiological parameters instead:
activation{g_K,g_Na,g_l}(layer::NeuralLayer{g_K,g_Na,g_l} = f(g_K, g_Na, g_l)
关键是功能和行为external到数据。使用类型定义和抽象类型层次结构来定义行为,如外部函数中编码的那样……但仅将数据本身存储在类型中。这与 Python 或其他强面向对象的范例有很大不同,并且需要一些时间来适应。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)