将矩阵的行/列提取为单独的变量

时间:2015-10-07 06:53:39

标签: julia

昨天我的课程中出现了以下问题:

假设我有一个矩阵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?除了使用这个漂亮的语法之外,这会有用吗?

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 :(得分:1)

如果MVector Vector的{​​{1}}(而不是矩阵),我刚刚找到的一个不错的选择是使用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))