所以这是设置.我有多个复合类型定义了自己的字段和构造函数.让我们在这里展示两个简化的组件:
type component1
x
y
end
type component2
x
y
z
end
Run Code Online (Sandbox Code Playgroud)
现在我想定义一个新类型,以便它可以在其中保存一个大小为K的先前定义的复合类型的数组.因此它是具有两个字段的参数复合类型:一个是整数K,另一个是传递类型的大小为K的数组.
type mixture{T}
components::Array{T, 1}
K::Int64
function mixture(qq::T, K::Int64)
components = Array{typeof(qq), K}
for k in 1:K
components[k] = qq
end
new(components, K)
end
end
Run Code Online (Sandbox Code Playgroud)
但这不是正确的方法.因为所有K个组件都指的是一个对象并且操纵混合物.组件[k]将影响所有K个组件.在python中,我可以使用deepcopy来解决这个问题.但是Julia中的深度复制没有为复合类型定义.我该如何解决这个问题?
假设您在Julia中定义了一个新的复合类型以及该类型的变量:
type MyType
?::Int64
?::Vector{Float64}
?::Float64
MyType(?::Int64, ?::Vector{Float64}, ?::Float64) = new(?, ?, ?)
end
mt = MyType(5, [1.2, 4.1, 2], 0.2)
Run Code Online (Sandbox Code Playgroud)
现在,如果您处于REPL模式,只需mt输入mt并按Enter 即可查看值:
mt
MyType(5,[1.2,4.1,2.0],0.2)
Run Code Online (Sandbox Code Playgroud)
如果我想自定义MyType显示变量的方式,我可以定义一个函数并使用它customized_display(mt):
function customized_display(me::MyType)
println("MyType")
println("?:$(me.?), ?:$(me.?), ?:$(me.?)")
end
customized_display(mt)
MyType
?:5, ?:[1.2,4.1,2.0], ?:0.2
Run Code Online (Sandbox Code Playgroud)
但是使用另一个显示值的函数mt似乎是多余的.我需要扩展哪个功能,只需输入mt,就会显示自定义显示?
我正在使用Gibbs采样为贝叶斯推理编写一个包.由于这些方法通常计算成本很高,我非常关心代码的性能.事实上,速度是我从Python转向Julia的原因.
在实现Dirichlet Process Model之后,我使用Coverage.jl和--track-allocation=user命令行选项分析了代码.
这是覆盖结果
- #=
- DPM
-
- Dirichlet Process Mixture Models
-
- 25/08/2015
- Adham Beyki, odinay@gmail.com
-
- =#
-
- type DPM{T}
- bayesian_component::T
- K::Int64
- aa::Float64
- a1::Float64
- a2::Float64
- K_hist::Vector{Int64}
- K_zz_dict::Dict{Int64, Vector{Int64}}
-
- DPM{T}(c::T, K::Int64, aa::Float64, a1::Float64, a2::Float64) = new(c, K, aa, a1, a2,
- Int64[], (Int64 => Vector{Int64})[])
- end
1 DPM{T}(c::T, K::Int64, aa::Real, a1::Real, a2::Real) = DPM{typeof(c)}(c, K, convert(Float64, …Run Code Online (Sandbox Code Playgroud) 我有一个字典列表,如:
dict_list = [{'key1': 'dict1_value1', 'key2': 'dict1_value2', 'key3': 'dict1_value3'},
{'key1': 'dict2_value1', 'key2': 'dict2_value2', 'key3': 'dict2_value3'},
{'key1': 'dict3_value1', 'key2': 'dict3_value2', 'key3': 'dict3_value3'},
{'key1': 'dict4_value1', 'key2': 'dict4_value2', 'key3': 'dict4_value3'},
{'key1': 'dict5_value1', 'key2': 'dict5_value2', 'key3': 'dict5_value3'}]
Run Code Online (Sandbox Code Playgroud)
获取第二个列表项的'key3'的值如下:
dict_list[1]['key3']
dict2_value3
Run Code Online (Sandbox Code Playgroud)
以下代码返回列表中的项目2:4:
dict_list[1:3]
Run Code Online (Sandbox Code Playgroud)
如果我想从列表中获取多个项目的'key3'值,该怎么办?喜欢
dict_list[1:3]['key3']
Run Code Online (Sandbox Code Playgroud)
类似于我们在MATLAB中所做的事情.
假设我们在julia中有一个Vector元组(Int64, Int64):
In [1] xx = [(1, 2), (3, 4), (5, 6)]
typeof(xx) == Vector{(Int64, Int64)}
Out[1] true
Run Code Online (Sandbox Code Playgroud)
现在我想构建一个元组的第一个索引的新向量.
In [2] indices = [x[1] for x in xx]
typeof(indices)
Out[2] Array{Any, 1}
Run Code Online (Sandbox Code Playgroud)
我希望它是一种Array{Int64, 1}类型.我怎样才能解决这个问题?
编辑:我使用0.3.9.