2015-10-07 5 views
5

निम्नलिखित प्रश्न कल अपने कोर्स में आया के कॉलम:निकालें पंक्तियों/अलग चर में एक मैट्रिक्स

मान लीजिए मैं एक मैट्रिक्स M = rand(3, 10) है कि एक गणना से बाहर आता है, जैसे एक ओडीई सॉल्वर।

अजगर में, आप

x, y, z = M

कर सकते हैं तीन चर, उदा में M की पंक्तियों को निकालने के लिए matplotlib साथ साजिश रचने के लिए।

जूलिया में हम कर सकते थे

M = M' # transpose 
x = M[:, 1] 
y = M[:, 2] 
z = M[:, 3] 

इस निष्कर्षण करने के लिए एक अच्छा तरीका है? यह कम से कम लिखने के लिए (अजगर आ)

x, y, z = columns(M) 

या

सक्षम होने के लिए अच्छा होगा
x, y, z = rows(M) 

एक तरह से

columns(M) = [ M[:,i] for i in 1:size(M, 2) ] 

होगा, लेकिन इस बात का एक महंगी प्रतिलिपि कर देगा सभी डेटा

इस हम एक नए इटरेटर प्रकार, ColumnIterator, कि स्लाइस रिटर्न की आवश्यकता होगी से बचने के लिए? इस यह अच्छा सिंटेक्स के उपयोग के अलावा और कुछ के लिए उपयोगी हो सकते हैं?

+4

क्यों नहीं 'कॉलम (एम) = [टुकड़ा (एम ,: , मैं) मैं में के लिए 1: आकार (एम, 2)] '? इस वाक्यविन्यास में क्या गलत है? [: 1 में मैं के लिए उप (, मैं एम,): आकार (एम, 2)]: –

+3

नकल के बिना कॉलम (एम) = –

+0

हां, यह काम करना चाहिए, धन्यवाद! - यकीन नहीं है कि मैंने इसके बारे में क्यों नहीं सोचा था। –

उत्तर

1

columns(M) = [ slice(M,:,i) for i in 1:size(M, 2) ]

और

columns(M) = [ sub(M,:,i) for i in 1:size(M, 2) ]

वे दोनों एक दृश्य के लौटने के लिए, लेकिन टुकड़ा सभी आयामों scalars साथ अनुक्रमित चला जाता है।

1

एक अच्छा विकल्प है कि मैं सिर्फ अगर M पाया है Vector रों (मेट्रिक्स के बजाय) के एक Vectorzip उपयोग कर रहा है:

julia> M = Vector{Int}[[1,2,3],[4,5,6]] 
2-element Array{Array{Int64,1},1}: 
[1,2,3] 
[4,5,6] 

julia> a, b, c = zip(M...) 
Base.Zip2{Array{Int64,1},Array{Int64,1}}([1,2,3],[4,5,6]) 

julia> a, b, c 
((1,4),(2,5),(3,6)) 
संबंधित मुद्दे