2015-11-01 26 views
0

這是交易。我取得了朱莉婭郎的自定義類型:如何更改自定義類型數組元素中的特定字段?

type points 
    x::Float64 
    y::Float64 
    z::Float64 
end 

而且也取得了這種類型的數組:

S = Array(ponits,1,Int(N)) 

所以現在我想改變我的(例如I = 3)數組元素的域x例如,4.28。但我這樣做時:

S[3].x = 4.28 

它改變ALL陣列S.因此我具有由具有的X日提交等於4.28的所有元素數組S。我讀了朱莉婭的文件,並沒有發現任何關於這個。它在Julia中如何工作?

在此先感謝。

P.S.哦,因爲我已經做了這個線程。如何製作自定義類型的零元素?對於exaplme,零點類型將是類似(0,0,0)。

回答

5

如果您有一個對同一對象的引用數組,並嘗試對其中的一個進行變異,那麼您將得到該結果,例如,如果使用fill()功能,以填補對象的數組,可能導致以下問題:

julia> s=Vector{Points}(3) 
3-element Array{Points,1}: 
#undef 
#undef 
#undef 
julia> fill!(s,Points(NaN,NaN,NaN)) 
3-element Array{Points,1}: 
Points(NaN,NaN,NaN) 
Points(NaN,NaN,NaN) 
Points(NaN,NaN,NaN) 
julia> s[1].x=1 
1.0 

julia> s 
3-element Array{Points,1}: 
Points(1.0,NaN,NaN) 
Points(1.0,NaN,NaN) 
Points(1.0,NaN,NaN) 

爲了避免這種問題的使用數組,理解來填補它:

s=[Points(NaN,NaN,NaN) for i=1:3]

但是我從您的示例代碼看到的是:

Points數據類型沒有自定義constructor並且此外,s數組還沒有初始化化的。

julia> s = Array(Points,1,4) 
1x4 Array{points,2}: 
#undef #undef #undef #undef 

所以如果你嘗試變異元素上,你會得到一個錯誤:

最小的變化
julia> s[1].x 
ERROR: UndefRefError: access to undefined reference 
in getindex at array.jl:282 

一個解決方案是使用Points默認構造函數是這樣的:

s[1]=Points(NaN,NaN,NaN) 

後您將能夠變異ss[1].x=4.28

其次具有Points類型的zero,應添加zero(::Points)方法:

julia> import Base.zero 

julia> zero(::Points)=Points(0,0,0) 
zero (generic function with 14 methods) 

julia> zero(Points(1,2,3)) 
Points(0.0,0.0,0.0) 

提示:使用1XN陣列來處理N個元素的Array是不是最好的選擇,Refer,使用Vector{Type}(N)代替。

相關問題