2015-11-05 28 views
2

我決定在幾天前嘗試julia,並試圖將我的一個python項目轉換爲julia。我明白使用類型系統對於良好的性能至關重要。不過,我在python是這樣的:如何在julia中組織複雜的數據

class Phonon(object): 
    # it has an attribute called D which looks like 
    # D = {'on_site': [D00, D11, D22, D33 ...], 'lead':{'l': [Dl00, Dl01, Dl11], 'r': [Dr00, Dr01, Dr11]},'couple': [D01, D12, D23 ...], 'lead_center':{'l': Dlcl, 'r': Dlcr}} 
    # all D00, D11, D22 matrices are numpy arrays 

如果我翻譯成朱莉婭這一點,那就是:

type Phonon: 
    D::Dict{ASCIIString, Any} 
end 

看來,編譯器不能得到什麼phonon s爲多信息來源。所以我的問題是:茱莉亞人如何組織他們複雜的數據?

+0

如何使用[複合類型](http://docs.julialang.org/en/latest/manual/types/?highlight=composite%20type#composite-types)和zip'D'? – Gnimuc

+0

我試過了,但'D ['onsite']'仍然是'Array {Any,1}'。然後我必須定義另一個複合類型。聽起來不好。 –

+0

你的numpy數組是什麼樣的? – Gnimuc

回答

3

如果我正確地理解你,你可能會想是這樣的:

type PhononDict{T<:Number} 
    on_site::Vector{Matrix{T}} 
    lead::Dict{ASCIIString, Vector{Matrix{T}}} 
    couple::Vector{Matrix{T}} 
    lead_center::Dict{ASCIIString, Matrix{T}} 
end 

我假設你numpy的陣列<的元素類型:數字,您可以將其調整爲類似T<:Union{Int64, Float64}代替。

這裏的關鍵問題是lead::Dict,所以D::Dict{ASCIIString, Any}

julia> typejoin(Array, Dict) 
Any 

我建議改變D成一個複合類型,那麼你可以傳遞更多信息以編譯器。更多關於parametric types的信息。