【问题标题】:Creating views of user types in julia在 Julia 中创建用户类型的视图
【发布时间】:2016-10-12 18:01:00
【问题描述】:

新的 julia 0.5 改进了对数组视图的支持。是否可以使用此功能来允许查看自定义类型?例如。所以我可以

immutable test
    a::Vector{Int}
    b::Vector{Int}
end

然后定义一个getviewfunction,例如当以 1:3 作为参数传递时,给我一个 test 的视图,就像 test(view(a,1:3), view(b,1:3) 一样? (这样做会创建一个新的测试对象,其中 a 和 b 是子数组的副本,这不是我想要的)。 谢谢!

【问题讨论】:

    标签: julia array-view


    【解决方案1】:

    关键是,如果您希望您的类型保存 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 的世界 [仍然] 很小,不是吗...)我不得不承认我并不完全理解它 - 为什么使类型参数化会改变数组是否被复制?您知道文档中的某个地方可以阅读此内容吗? - 我认为理解这一点可能会解决当前的一些问题......
    • 这比您想象的要容易。参数 T 只是表示“我可以是任何东西,只要 ab 具有相同的类型”。因此,如果您将任何相同类型的 ab 传递给构造函数,它会很乐意按原样接受它们。但是,如果您明确地说“我必须有 2 个 Vector{Int}”,那么如果您将其他内容传递给它们,它将尝试传递给 convert(Vector{Int}, a)b
    • 另请注意,您可以使用类型签名immutable MyType{T<:AbstractVector} 将允许的类型限制为AbstractVector 的任何子类型,Vector{T}SubArray{T,1,...} 都是如此跨度>
    • 谢谢,好的,我没有意识到指定类型(非参数)可能会触发副本,尽管我认为这是有道理的。我要创建视图的类型已经是参数化的,它们的字段也是复合类型,其中一些是参数化的,所以我可能会触发对象的部分复制。我想解决方案必须是使所有字段参数化以确保不发生转换?这无疑给了我一些东西。
    猜你喜欢
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多