2013-01-20 6 views
18

Julia'da bir 1 * N veya N * 1 boyutundaki bir Matrix'i {T} bir Vector'e dönüştürmenin en etkili yolu nedir? Örneğin Julia'daki bir 1 * N veya N * 1 boyutundaki bir Matrix {T} 'yi Vector {T}' ye dönüştürmenin en etkili yolu nedir?

I. tipteki Array{Int,2} (yani Matrix{Int}) vardır

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

Hem a ve b olduğunu varsayalım. a ve b'u Array{Int,1} (ör. Vector{Int}) türüne dönüştürmenin en etkili yolları nelerdir?

Bir yaklaşım geçerli:

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

cevap

27

Sen vec() işlevini kullanabilirsiniz. Bu liste anlama daha hızlıdır ve elemanların sayısı ile iyi scale; 1000x1 matrisi için) : (

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 saniye # liste anlama

2.92e-7 saniye # vec)

+12

önemli bir nokta hem 'reshape' onlar performans için altta yatan dizisi ile hafızayı paylaşan olmasıdır vec' ve' - işte 'vec' çok daha hızlı neden böyle olduğunu içeriği kopyalayan yeni bir dizi nesnesi oluşturan bir kavrayıştan daha fazlası. Böylece, bir [1] 'i değiştirirseniz, 'v_aII [1]' de değişecek ve tersi olacak, 'v_a [1]' ise etkilenmeyecektir. – StefanKarpinski

3

ben matris ise bunu yapmak için squeeze kullanma eğiliminde olacaktır 1xN veya Nx1:

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

Bu, vec veya reshape'u kullanmanın daha verimli olup olmadığından emin değil.

+0

İyi, Bu işlevi bilmiyordum. –

+1

Tanımları görerek, sıkıştırmanın diğerinden biraz daha yavaş olması gerekiyor. https://github.com/JuliaLang/julia/blob/master/base/abstractarray.jl#L152 Biraz kriter, ve ben buldum: sıkmak (m): (2.97 + - 2) e-6 saniye vec (m): (2.02 + - 2) e-6 saniye yeniden şekillendirme (m, uzunluğu (m)), (1.72 + - 2) e-6 saniye fark çok çok azdır ama nasıl tanımları ile bekleyebilir, yeniden şekillendirme (m, uzunluk (m)) daha hızlı seçenektir. –

1

vec() ilgili dikkate alınması gereken daha hızlı

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) 
İlgili konular