2017-05-09 67 views
1

我有一個陣列b = [1, 2, 1, 4]。這些值可以改變。我需要創建一個SharedArrayTuples,每個都有b[i]Int s。初始化各種長度元組的數組?

換句話說,如果我有b = [1, 2, 1, 4]我需要:

x = SharedArray{Tuple{Int}, Tuple{Int,Int}, Tuple{Int}, Tuple{Int,Int,Int,Int}}

我不能爲我的生活弄清楚如何。有任何想法嗎?

+0

閱讀了一下之後,我認爲可能沿線'SharedArray(Tuple {Vararg {Int64}},10)'可以工作,但事實並非如此。錯誤消息* ArgumentError:SharedArray元素的類型必須是位類型,得到Tuple {Vararg {Int64,N}} *表示有可能這是不可能的。但這只是一個猜測。一個解決方案可能是創建一個普通的'SharedArray' ints和* encode *你想要的。所以佈局在你的情況下看起來像'[b [1],v11,b [2],v21,v22,b [3],v31,b [4],v41,v42,v43,v44]',但這只是一個竅門。 – halirutan

回答

1

一個SharedArray只能包含位類型,其中Vararg一個Tuple是不是... ...但這裏的@ halirutan的編碼元組成扁平陣列的想法的草案:

immutable SharedThing{T} 
    data::SharedArray{T} 
    strides::Vector{Int} 
end 

function SharedThing{T}(tuples::Tuple{Vararg{T}}...) 
    strides = collect(map(length, tuples)) 
    data = SharedArray(T, sum(strides)) 
    i = 1 
    for (s, t) in zip(strides, tuples) 
    data[i:i+s-1] = collect(t) 
    i += s 
    end 
    SharedThing{T}(data, strides) 
end 

function Base.getindex{T}(xs::SharedThing{T}, i) 
    before = sum(xs.strides[1:i-1]) 
    tuple(xs.data[before+1:before + xs.strides[i]]...) 
end 

所以:

julia> xs = SharedThing((1, 2,3), (22, 33)) 
SharedThing{Int64}([1,2,3,22,33],[3,2]) 

julia> xs[1] 
(1,2,3) 

julia> xs[2] 
(22,33) 

當然,這是可優化的,沒有注意爲並行性獲得良好的共享結構,我也擔心它的類型處理不是最理想的......但它仍然可以爲您提供基礎。

+0

'Ints' *的'Tuple'是*位類型,至少在0.5。我不能使用這個解決方案,因爲我需要創建單獨的連續數組來指向'ccall'。當我嘗試過類似的結構時,我得到了段錯誤。我猜測創建的'SharedArray'不是連續的。 – bfletch

+0

好吧,對,但'Vararg'不是一個有點類型。無論如何,我不太瞭解共享陣列,我只是試了一下 - 如果沒有幫助,很抱歉。 – phg

+0

這對於那些剛性要求較低的人來說會非常有幫助。謝謝! – bfletch