2017-05-09 10 views
1

私は配列b = [1, 2, 1, 4]を持っています。これらの値は変更可能です。 のSharedArrayをそれぞれb[i]Intで作成する必要があります。言い換えればさまざまな長さのタプルの配列を初期化しますか?

私は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のみVarargTupleではありません...しかし、ここではフラットな配列にタプルをコードする@ 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'によってポイントされる別々の連続した配列を作成する必要があるので、私はこの解決法を使用できません。同様の構造を試してみると、私はsegfaultsを得ました。私は作成された 'SharedArray'が連続していないと推測しています。 – bfletch

+0

さて、しかし、 'Vararg'はビットタイプではありません。とにかく、私は共用配列について多くのことを知っているわけではありません。 – phg

+0

これは、厳格ではない要求でこれを見ている他の人にとって非常に役に立ちます。ありがとう! – bfletch

関連する問題