2015-10-07 4 views
5

die folgende Frage in meinem Kurs gestern kam:Extract Zeilen/Spalten einer Matrix in einzelne Variablen

nehme ich an eine Matrix M = rand(3, 10) haben, die aus einer Berechnung kommt, z.B. ein ODE-Löser.

In Python können Sie

x, y, z = M

tun, um die Reihen von M in die drei Variablen zu extrahieren, z.B. zum Plotten mit matplotlib.

In Julia konnten wir

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

Gibt es tun ein schöner Weg, um diese Extraktion zu tun? Es wäre schön, der Lage sein, zumindest (annähernd Python) würde

x, y, z = columns(M) 

oder

x, y, z = rows(M) 

Ein Weg

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

sein zu schreiben, aber das wird eine teure Kopie machen von alle Daten.

Um dies zu vermeiden, benötigen wir einen neuen Iteratortyp, ColumnIterator, der Segmente zurückgibt? Wäre das für etwas anderes nützlich, als diese nette Syntax zu verwenden?

+4

Warum nicht 'Spalten (M) = [Scheibe (M ,: , i) für i in 1: Größe (M, 2)] '? Was ist falsch an dieser Syntax? –

+3

Ohne zu kopieren: Spalten (M) = [sub (M,:, i) für i in 1: Größe (M, 2)] –

+0

Ja, das sollte funktionieren, danke! - Ich bin mir nicht sicher, warum ich nicht daran gedacht habe. –

Antwort

1

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

und

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

Beide geben eine Ansicht, aber slice löscht alle mit Skalare indexiert Dimensionen.

1

Eine schöne Alternative, die ich, wenn M gerade gefunden haben, ist ein Vector von Vector s (statt einer Matrix) wird unter Verwendung zip:

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))