Julia 将矩阵的行/列提取到单独的变量中

Julia 将矩阵的行/列提取到单独的变量中,julia,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)会很好 或 一种方法是 columns(M) = [ M[:,i] for i in 1

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

假设我有一个矩阵
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)会很好

一种方法是

columns(M) = [ M[:,i] for i in 1:size(M, 2) ]
但这将为所有数据制作昂贵的副本

为了避免这种情况,我们需要一种新的迭代器类型,
ColumnIterator
,它返回切片?除了使用这种漂亮的语法之外,这对其他任何东西都有用吗?

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

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

它们都返回一个视图,但slice会删除所有索引为的维度
标量。

如果
M
向量
向量
(而不是矩阵),我刚刚发现一个很好的替代方法是使用
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))

为什么不
列(M)=[1:size(M,2)中i的切片(M,:,i)]
?这个语法有什么问题?没有复制:columns(M)=[sub(M,:,i)for i in 1:size(M,2)]是的,应该可以,谢谢不知道为什么我没有想到。对不起,它们都返回一个视图,但是
sub
返回一个2D矩阵,而
slice
则抑制单例索引并返回一个向量,这是PyPlot所需要的。您可以决定需要什么。区别如下所述:
columns(M) = [ M[:,i] for i in 1:size(M, 2) ]
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))