2015-10-07 26 views
5

次の質問は、昨日の私のコースで思い付いた:行列の抽出行/列

は、例えば、私は計算から出てくる行列M = rand(3, 10)を持っていると仮定しますODEソルバー。 Pythonで

、あなたは、例えば、3つの変数にMの行を抽出するために

x, y, z = M

を行うことができますmatplotlibでプロットします。我々は

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

を行うことができジュリアで

この抽出を行うためのよりよい方法はありますか? 一つの方法は、

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

だろうが、これは高価なコピーを作成します

x, y, z = columns(M) 

または

x, y, z = rows(M) 
(パイソンに近づいて)少なくとも書くことができるようにするとよいでしょうすべてのデータ

これを避けるには、スライスを返す新しいイテレータタイプ、ColumnIteratorが必要ですか?これは、この素晴らしい構文を使用する以外の目的には有効でしょうか?

+4

なぜ '列(M)= [スライス(M ,: 、i)for i in 1:size(M、2)] '?この構文の何が間違っていますか? –

+3

コピーしないでください:columns(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は、(代わりに行列の)VectorVectorのSである場合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)) 
関連する問題