在 julia 中创建用户类型的视图
Creating views of user types in julia
新的 julia 0.5 改进了对数组视图的支持。是否可以使用此功能来允许自定义类型的视图?例如。这样我就可以
immutable test
a::Vector{Int}
b::Vector{Int}
end
然后定义一个 getview
函数,例如当传递 1:3 作为参数时,给我一个像 test(view(a,1:3), view(b,1:3)
这样的 test
的视图? (只是这样做会创建一个新的测试对象,其中 a 和 b 是子数组的副本,这不是我想要的)。
谢谢!
关键是,如果您希望您的类型包含 Array 或 SubArray,则需要使其参数化。否则它将在构建新对象时被转换(复制)。
julia> immutable MyType{T}
a::T
b::T
end
julia> Base.view(mt::MyType, args...) = MyType(view(mt.a, args...), view(mt.b, args...))
julia> mt = MyType(rand(5),rand(5))
MyType{Array{Float64,1}}([0.791258,0.605581,0.126802,0.559727,0.156383],[0.773287,0.223521,0.926932,0.0301801,0.68872])
julia> view(mt, 2:3)
MyType{SubArray{Float64,1,Array{Float64,1},Tuple{UnitRange{Int64}},true}}([0.605581,0.126802],[0.223521,0.926932])
新的 julia 0.5 改进了对数组视图的支持。是否可以使用此功能来允许自定义类型的视图?例如。这样我就可以
immutable test
a::Vector{Int}
b::Vector{Int}
end
然后定义一个 getview
函数,例如当传递 1:3 作为参数时,给我一个像 test(view(a,1:3), view(b,1:3)
这样的 test
的视图? (只是这样做会创建一个新的测试对象,其中 a 和 b 是子数组的副本,这不是我想要的)。
谢谢!
关键是,如果您希望您的类型包含 Array 或 SubArray,则需要使其参数化。否则它将在构建新对象时被转换(复制)。
julia> immutable MyType{T}
a::T
b::T
end
julia> Base.view(mt::MyType, args...) = MyType(view(mt.a, args...), view(mt.b, args...))
julia> mt = MyType(rand(5),rand(5))
MyType{Array{Float64,1}}([0.791258,0.605581,0.126802,0.559727,0.156383],[0.773287,0.223521,0.926932,0.0301801,0.68872])
julia> view(mt, 2:3)
MyType{SubArray{Float64,1,Array{Float64,1},Tuple{UnitRange{Int64}},true}}([0.605581,0.126802],[0.223521,0.926932])