2015-10-07 51 views
5

以下問題在我當然昨天來了的列:提取行/矩陣成獨立的變量

假設我有一個矩陣M = rand(3, 10)散發出來計算的,例如一個ODE求解器。

在Python中,你可以做

x, y, z = M

M行提取到三個變量,例如用matplotlib進行繪圖。

在朱莉婭我們可以做

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

有沒有一個更好的辦法做到這一點的提取? 這將是很好能夠至少寫(接近Python)的

x, y, z = columns(M) 

x, y, z = rows(M) 

一種方法是

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

但這將會使昂貴的拷貝所有的數據。

爲了避免這種情況,我們需要一個新的迭代器類型ColumnIterator,它返回切片?除了使用這個很好的語法之外,這對其他任何東西都有用嗎

+4

爲什麼不'列(M)= [切片(M ,: ,i)for i in 1:size(M,2)]'?這個語法有什麼問題? –

+3

無需複製:列(M)= [sub(M,:i)for i in 1:size(M,2)] –

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

他們都返回一個視圖,但切片下降與 標量索引的所有尺寸。

1

,我剛發現如果M一個不錯的選擇是Vector秒(而不是矩陣)一個Vector使用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))