2015-10-07 17 views
5

alla seguente domanda è venuto nel mio corso di ieri Estratto:righe/colonne di una matrice in variabili distinte

Supponiamo che io abbia una matrice M = rand(3, 10) che esce di un calcolo, ad esempio, un risolutore ODE.

In Python, si può fare

x, y, z = M

per estrarre i file di M nelle tre variabili, per esempio per tracciare con matplotlib.

In Julia potremmo fare

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

C'è un modo migliore per fare questa estrazione? Sarebbe bello essere in grado di scrivere almeno (avvicinandosi Python)

x, y, z = columns(M) 

o

x, y, z = rows(M) 

Un modo potrebbe essere

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

ma questo farà una copia costoso tutti i dati

Per evitare questo, è necessario un nuovo tipo di iteratore, ColumnIterator, che restituisce le fette? Sarebbe utile per qualcosa di diverso dall'usare questa bella sintassi?

+4

Perché non 'colonne (M) = [slice (M ,: , i) per i in 1: size (M, 2)] '? Cosa c'è di sbagliato in questa sintassi? –

+3

Senza copiare: colonne (M) = [sub (M,:, i) per i in 1: dimensione (M, 2)] –

+0

Sì, dovrebbe funzionare, grazie! - Non sono sicuro del motivo per cui non ci ho pensato. –

risposta

1

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

e

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

Entrambi restituiscono una vista, ma fetta gocce tutte le dimensioni indicizzati con scalari.

1

Una bella alternativa che ho appena trovato se M è un Vector di Vector s (invece di una matrice) sta usando 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)) 
Problemi correlati