这是合约。我在Julia lang做了一个自定义类型:
type points
x::Float64
y::Float64
z::Float64
end
并且还制作了这种类型的数组:
S = Array(ponits,1,Int(N))
所以现在我想将i(例如i = 3)数组元素的字段x改为例如4.28。但是当我这样做时:
S[3].x = 4.28
它改变了所有数组S.因此,我有一个数组S,所有元素都有x-filed等于4.28。我读过朱莉娅的文件,但没有找到任何相关信息。它在朱莉娅是如何运作的?
提前致谢。
P.S。哦,因为我已经做了这个帖子。如何制作自定义类型的零元素?对于exaplme,点类型的零将是(0,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)
之后,您将能够改变s
,s[1].x=4.28
其次要zero
Points
类型,您应该添加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数组处理Array
个N元素不是最佳选择,Refer,而是使用Vector{Type}(N)
。