2017-05-09 4 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 (Vuparg {Vararg {Int64}}, 10)'줄에있는 뭔가가 효과가 있을지 모르지만 그렇지 않다고 생각했습니다. 오류 메시지 * ArgumentError : SharedArray 요소의 형식은 비트 형식이어야합니다. Tuple {Vararg {Int64, N}} *은 이것이 가능하지 않을 가능성이 있음을 나타냅니다. 그러나 이것은 단지 추측 일뿐입니다. 해결책은 ints의 보통'SharedArray'를 만들고 원하는 것을 * 인 코드 할 수 있습니다. 그래서 레이아웃은'[b [1], v11, b [2], v21 ,, v22, b [3], v31, b [4], v41, v42, v43, v44] 그것은 단지 해킹 일뿐입니다. – halirutan

답변

1

SharedArrayVarargTuple가 아닌 ...하지만 여기에 평면 배열에 튜플을 인코딩 @ 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'이 가리키는 별도의 연속 배열을 생성해야하기 때문이다. 비슷한 구조를 시도했을 때, 나는 segfault를 얻었다. 내가 만든'SharedArray'가 인접하지 않았던 것 같습니다. – bfletch

+0

좋습니다.하지만 Vararg는 비트 형식이 아닙니다. 어쨌든, 공유 배열에 대해 많은 것을 알지 못한다. 도움이되지 않는다면 미안하다. – phg

+0

이렇게하면 덜 엄격한 요구 사항을 충족시키는 다른 사용자에게 큰 도움이됩니다. 감사! – bfletch