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