Dictionary 使用元组在Julia中有键,而不初始化字典

Dictionary 使用元组在Julia中有键,而不初始化字典,dictionary,julia,Dictionary,Julia,我是朱莉娅的新手。对于我的应用程序,我有一个昂贵的运算来计算基于两点的矩阵。计算出的矩阵将被多次使用,所以我想我会将它们缓存在字典中。然而,我在朱莉娅身上遇到了一种奇怪的行为。如果我添加第一个(键、值)对作为字典初始化的一部分,它将按预期工作。然而,如果我不这样做,并尝试添加我的第一个(键,值)对后,朱莉娅炸弹了 p1 = [ 2.0, 1.0, 1.0] p2 = [ 4.0, 2.0, 1.0] # This works my_dict = Dict{Tuple{Array{Float64

我是朱莉娅的新手。对于我的应用程序,我有一个昂贵的运算来计算基于两点的矩阵。计算出的矩阵将被多次使用,所以我想我会将它们缓存在字典中。然而,我在朱莉娅身上遇到了一种奇怪的行为。如果我添加第一个(键、值)对作为字典初始化的一部分,它将按预期工作。然而,如果我不这样做,并尝试添加我的第一个(键,值)对后,朱莉娅炸弹了

p1 = [ 2.0, 1.0, 1.0]
p2 = [ 4.0, 2.0, 1.0]

# This works
my_dict = Dict{Tuple{Array{Float64,1}, Array{Float64,1}}, String}(
    (p1, p2) => "hello world"
)
println(my_dict[(p1, p2)])

# This works
my_dict[ (p2, p1)] = "hello again"
println(my_dict[ (p2, p1)] )

# This doesn't
my_dict2 = Dict{Tuple{Array{Float64,1}, Array{Float64,1}}, String}
my_dict2[(p2, p1)] = "this fails with method dispatch error"
Julia的输出:

julia complex_key_for_dict.jl 
hello world
hello again
ERROR: LoadError: MethodError: no method matching setindex!(::Type{Dict{Tuple{Array{Float64,1},Array{Float64,1}},String}}, ::String, ::Tuple{Array{Float64,1},Array{Float64,1}})
Stacktrace:
 [1] top-level scope at none:0
 [2] include at ./boot.jl:326 [inlined]
 [3] include_relative(::Module, ::String) at ./loading.jl:1038
 [4] include(::Module, ::String) at ./sysimg.jl:29
 [5] exec_options(::Base.JLOptions) at ./client.jl:267
 [6] _start() at ./client.jl:436
in expression starting at /home/peter/julia/gps_analysis/complex_key_for_dict.jl:16


现在,我只想在字典中添加一个虚构的第一个条目,但如果有人能告诉我我的错误,我将不胜感激。

没有什么比向StackOverflow发帖更能让我意识到解决方案可能是什么了。这项工作:

# This works.  Added an open/close bracket to the end of the Dict defintion
my_dict2 = Dict{Tuple{Array{Float64,1}, Array{Float64,1}}, String}()
my_dict2[ (p2, p1)] = "this now works"

println(my_dict2[ (p2, p1)])

我想我会把答案贴出来,这样其他人也会觉得这很有帮助。

万一你不知道,如果你正在用值实例化dict,就不需要包含复杂的类型签名。只要写:
d=Dict((p1,p2)=>“Hello world!”)
,就会自动推断出正确的类型。如果你想要一个更宽松的签名,你只需要指定类型。这很有用,我不知道。在我的真实应用程序中(与此玩具版本相反),我将提前定义缓存,因此现在需要签名。