我有一個陣列b = [1, 2, 1, 4]
。這些值可以改變。我需要創建一個SharedArray
的Tuples
,每個都有b[i]
Int
s。初始化各種長度元組的數組?
換句話說,如果我有b = [1, 2, 1, 4]
我需要:
x = SharedArray{Tuple{Int}, Tuple{Int,Int}, Tuple{Int}, Tuple{Int,Int,Int,Int}}
我不能爲我的生活弄清楚如何。有任何想法嗎?
我有一個陣列b = [1, 2, 1, 4]
。這些值可以改變。我需要創建一個SharedArray
的Tuples
,每個都有b[i]
Int
s。初始化各種長度元組的數組?
換句話說,如果我有b = [1, 2, 1, 4]
我需要:
x = SharedArray{Tuple{Int}, Tuple{Int,Int}, Tuple{Int}, Tuple{Int,Int,Int,Int}}
我不能爲我的生活弄清楚如何。有任何想法嗎?
一個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)
當然,這是可優化的,沒有注意爲並行性獲得良好的共享結構,我也擔心它的類型處理不是最理想的......但它仍然可以爲您提供基礎。
閱讀了一下之後,我認爲可能沿線'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