2013-01-20 3 views
18

Was ist der effizienteste Weg, um eine Matrix {T} der Größe 1 * N oder N * 1 in Julia in einen Vektor {T} zu konvertieren?Was ist der effizienteste Weg, um eine Matrix {T} der Größe 1 * N oder N * 1 in Julia in einen Vektor {T} zu konvertieren?

Zum Beispiel sage ich

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

Sowohl a und b sind vom Typ Array{Int,2} (das heißt Matrix{Int}) haben. Was sind die effizientesten Möglichkeiten, a und b in den Typ Array{Int,1} (d. H. Vector{Int}) zu konvertieren?

Ein Ansatz ist:

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

Antwort

27

Sie die vec() Funktion nutzen zu können. Es ist schneller als die Liste Verständnis und skaliert besser mit der Anzahl der Elemente;) Für eine Matrix von 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 Sekunden # Liste Verständnis

2.92e-7 Sekunden # vec ()

+12

Eine wichtige Sache zu beachten beide 'vec' und' reshape' ist, dass sie für Performance-Speicher mit dem zugrunde liegenden Array gemeinsam nutzen - das ist, warum 'vec' so viel schneller als ein Verständnis, das ein neues Array-Objekt erstellt und Inhalt kopiert. Wenn Sie also 'a [1]' ändern, ändert sich auch 'v_aII [1]' und umgekehrt, während 'v_a [1]' davon nicht betroffen ist. – StefanKarpinski

3

ich würde dazu neigen, squeeze zu verwenden, um dies zu tun, wenn die Matrix 1xN oder Nx1 ist:

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

Nicht sicher, ob das effizienter als vec oder reshape ist.

+0

Gut, ich wusste nicht über diese Funktion. –

+1

In den Definitionen sieht es so aus, als ob Squeeze etwas langsamer als die anderen sein muss. https://github.com/JuliaLang/julia/blob/master/base/abstractarray.jl#L152 ich ein wenig Benchmark, und ich fand: Squeeze (m): (2,97 + - 2) e-6 Sekunden vec (m): (2,02 + - 2) E-6 Sekunden reshape (m, Länge (m)): (1,72 + - 2) E-6 Sekunden Unterschied sehr sehr kleiner , aber wie man durch Definitionen erwarten kann, ist die Umformung (m, Länge (m)) die schnellere Option. –

1

vec() schneller

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)