2013-01-20 10 views
18

जूलिया में आकार 1 * एन या एन * 1 के मैट्रिक्स {टी} को एक वेक्टर {टी} में परिवर्तित करने का सबसे प्रभावी तरीका क्या है?जूलिया में आकार 1 * एन या एन * 1 के मैट्रिक्स {टी} को वेक्टर {टी} में परिवर्तित करने का सबसे प्रभावी तरीका क्या है?

उदाहरण के लिए, मैं

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

दोनों a और b है प्रकार Array{Int,2} (अर्थात Matrix{Int}) के हैं का कहना है। a और b को Array{Int,1} (यानी Vector{Int}) टाइप करने के लिए सबसे प्रभावी तरीके क्या हैं?

एक दृष्टिकोण है:

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

उत्तर

27

आप vec() फ़ंक्शन का उपयोग कर सकते हैं। यह सूची समझ से अधिक तेज़ है और तत्वों की संख्या के साथ बेहतर मापता है;) 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 सेकंड # सूची समझ

2.92e-7 सेकंड # vec ()

+12

एक महत्वपूर्ण बारे में ध्यान देने की बात है दोनों 'vec' और' reshape' है कि वे प्रदर्शन के लिए अंतर्निहित सरणी के साथ स्मृति का हिस्सा है - इसलिए 'vec' इतना तेजी से होता है एक समझ से, जो एक नई सरणी वस्तु बनाता है, सामग्री की प्रतिलिपि बनाता है। इस प्रकार, यदि आप 'एक [1] ',' v_aII [1] 'बदलते हैं और इसके विपरीत भी बदलेंगे, जबकि' v_a [1] 'अप्रभावित होगा। – StefanKarpinski

3

मैं squeeze उपयोग करने के लिए यह करने के लिए करता है, तो मैट्रिक्स है करते हैं 1xN या Nx1:

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

यह सुनिश्चित नहीं है कि vec या reshape का उपयोग करने से यह अधिक कुशल है।

+0

अच्छा, मुझे इस फ़ंक्शन के बारे में पता नहीं था। –

+1

परिभाषाओं में देखकर, लगता है जैसे निचोड़ दूसरे की तुलना में थोड़ा धीमा होना चाहिए। https://github.com/JuliaLang/julia/blob/master/base/abstractarray.jl#L152 मैं एक छोटे से बेंचमार्क करते हैं, और मैंने पाया: निचोड़ (एम): (2.97 + - 2) ई-6 सेकंड vec (एम): (2.02 + - 2) ई-6 सेकंड आकृति बदलें (एम, लंबाई (एम)): (1.72 + - 2) ई-6 सेकंड अंतर बहुत बहुत छोटा है , लेकिन परिभाषाओं से कैसे उम्मीद कर सकते हैं, reshape (एम, लंबाई (एम)) तेजी से विकल्प है। –

1

vec() तेजी से

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) 
संबंधित मुद्दे