2015-05-02 48 views
3

有沒有辦法在Julia中連接ArrayViews,它不復制底層數據? (如果能解決問題,我也很樂意使用SubArray。)在Julia中連接ArrayViews(或sliceviews或SubArrays)?

例如,在下面的代碼中,我想要一個引用y1y2中的數據的ArrayView。

julia> x = [1:50]; 

julia> using ArrayViews; 

julia> y1 = view(x, 2:5); 

julia> y2 = view(x, 44:48); 

julia> concat(y1, y2) # I wish there were a function like this 
ERROR: concat not defined 

julia> [y1, y2] # This copies the data in y1 and y2, unfortunately 
9-element Array{Int64,1}: 
    2 
    3 
    4 
    5 
44 
45 
46 
47 
48 
+1

你看過https://github.com/tanmaykm/ChainedVectors.jl嗎? –

回答

1

不直接。但你可以用類似的東西滾動你自己的類型:

julia> type CView{A<:AbstractArray} <: AbstractArray 
     a::A 
     b::A 
     end 

julia> import Base: size, getindex, setindex! 

julia> size(c::CView) = tuple([sa+sb for (sa, sb) in zip(size(c.a), size(c.b))]...) 
size (generic function with 57 methods) 

julia> getindex(c::CView, i::Int) = i <= length(c.a) ? getindex(c.a, i) : getindex(c.b, i) 
getindex (generic function with 180 methods) 

julia> c = CView(y1, y2); 

julia> size(c) 
(9,) 

julia> c[1] 
2 

julia> c[4] 
5 

julia> c[5] 
48 

這些方法可能不是最佳的,但它們當然可以讓你開始。爲了有用,可能需要更多的方法。請注意,關鍵在於決定索引哪個成員數組。對於多維索引sub2ind可以使用。