2016-06-06 4 views
1

У меня есть вектор x=[1.00, 1.50, 1.00, 2.30, 4.20, 1.00], а также еще один n=[2, 1, 3].Как преобразовать вектор в вектор векторов в Юлии

Я хотел бы превратить свой вектор x в вектор векторов следующим образом:

x[1] = [1.00, 1.50] x[2] = 1.00 x[3] = [2.30, 4.20, 1.00]

, где в каждом Вектор x, размер определяется n.

Какой может быть более быстрый способ реализовать это? Благодаря!

+0

Раствор одной линии с помощью 'пакет Iterators' (установить с' Pkg.add ("итераторы") ':' отображение (t-> х [(т [1] +1): т [2]], раздел (cumsum ([0, п]), 2,1)) ' –

ответ

5

Хотя не очень уверен, что о скорости, мы можем также использовать понимание (как обычно):

julia> x = [1.00, 1.50, 1.00, 2.30, 4.20, 1.00] 
julia> n = [2, 1, 3] 

julia> off = [ 0 ; cumsum(n) ] # offset indices 
4-element Array{Int64,1}: 
0 
2 
3 
6 

julia> Vector{Float64}[ x[ off[i]+1 : off[i]+n[i] ] for i=1:length(n) ] 
3-element Array{Array{Float64,1},1}: 
[1.0,1.5]  
[1.0]   
[2.3,4.2,1.0] 

В будущих версиях, мы, возможно, потребуется copy() для каждого вектора, чтобы сделать (> = V0.5?) полученный вектор не зависит от исходного x[:] (хотя и не очень точно ...)

julia> Vector{Float64}[ copy(x[ off[i]+1 : off[i]+n[i] ]) for i=1:length(n) ] 
0

Другой подход:

x = [1.00, 1.50, 1.00, 2.30, 4.20, 1.00] 
n = [2, 1, 3] 

g = Array{Any}(length(n)) 

for i in 1:length(n)   
    o = 1 + sum(n[1:(i-1)]) 
    p = sum(n[1:i]) 
    g[i] = x[o:p] 
end 

g 

Выход:

3-element Array{Any,1}: 
[1.0,1.5]  
[1.0]   
[2.3,4.2,1.0] 
Смежные вопросы