初始化各种长度元组的数组?

时间:2017-05-09 01:46:43

标签: initialization julia

我有一个数组b = [1, 2, 1, 4]。这些值可以改变。我需要使用SharedArray Tuples创建b[i] Int个。{/ p>

换句话说,如果我需要b = [1, 2, 1, 4]

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

我不能为我的生活弄清楚如何。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

SharedArray只能包含Tuple Vararg不是......的比特类型,而是@ 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)

当然,这是可以优化的,不注意为并行性获得良好的共享结构,我也担心它的类型处理不是最理想的......但是,它仍然可以作为基础为你服务。