2013-01-20 12 views
18

Jaki jest najskuteczniejszy sposób konwersji Matrycy {T} o rozmiarze 1 * N lub N * 1 w Julii na wektor {T}?Jaki jest najskuteczniejszy sposób konwersji Matrycy {T} o rozmiarze 1 * N lub N * 1 w Julii na wektor {T}?

Załóżmy na przykład, że posiada

a = [1,3,5] 
b = a' 

Zarówno a i b są typu Array{Int,2} (tj Matrix{Int}). Jakie są najskuteczniejsze sposoby konwersji a i b na typ Array{Int,1} (tj. Vector{Int})?

Jedno podejście jest:

a_vec = [x::Int for x in a] 
b_vec = [x::Int for x in b] 

Odpowiedz

27

Można użyć funkcji vec(). Jest szybszy niż listowego i skaluje lepiej z wielu elementów;) Na matrycy 1000x1:

julia> const a = reshape([1:1000],1000,1); 

julia> typeof(a) 
Array{Int64,2} 

julia> vec_a = [x::Int for x in a]; 

julia> typeof(vec_a) 
Array{Int64,1} 

julia> vec_aII = vec(a); 

julia> typeof(vec_aII) 
Array{Int64,1} 

6.41e-6 sekund lista # zrozumieniem

2.92e-7 sekund # vec ()

+12

Jedną ważną rzeczą, aby pamiętać o obu '' reshape' vec' i jest to, że mają one pamięć z podstawowej tablicy wykonania - dlatego 'vec' jest tak dużo szybciej niż zrozumienie, które tworzy nowy obiekt tablicy, kopiowanie treści. Zatem jeśli zmienisz 'a [1]', 'v_aII [1]' również się zmieni i vice versa, podczas gdy 'v_a [1]' pozostanie nienaruszone. – StefanKarpinski

3

ja zazwyczaj wykorzystuje squeeze na to, że matryca jest 1xN lub Nx1:

squeeze(ones(3, 1)) 
squeeze(ones(1, 3)) 

Nie jestem pewien, czy jest to bardziej efektywne niż użycie vec lub reshape.

+0

Dobrze, nie wiedziałem o tej funkcji. –

+1

Widzenie w definicjach wygląda na to, że squeeze musi być trochę wolniejsze niż drugie. https://github.com/JuliaLang/julia/blob/master/base/abstractarray.jl#L152 zrobić trochę odniesienia, i znaleziono: prasującego (m): (2,97 + - 2) e-6 sekund Vec (m): (2,02 + - 2) e-6 sekund zmiany kształtu (m, długość (m)): (1,72 + - 2) e-6 sekund różnica jest bardzo mała , ale jak można się spodziewać po definicjach, zmiana kształtu (m, długość (m)) jest szybszą opcją. –

1

vec() jest szybsza

const a = reshape([1:1000],1000,1); 
@time vec(a); 
elapsed time: 6.914e-6 seconds (184 bytes allocated) 
@time squeeze(a,2); 
elapsed time: 1.0336e-5 seconds (248 bytes allocated) 
Powiązane problemy