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