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

Dav*_*ers 5 julia

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

假设我有一个M = rand(3, 10)来自计算的矩阵,例如ODE求解器.

在Python中,你可以做到

x, y, z = M

将行提取M到三个变量中,例如用于绘制matplotlib.

在Julia,我们可以做到

M = M'  # transpose 
x = M[:, 1]
y = M[:, 2]
z = M[:, 3]
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来进行这种提取?能够写至少(接近Python)会很高兴

x, y, z = columns(M)
Run Code Online (Sandbox Code Playgroud)

要么

x, y, z = rows(M)
Run Code Online (Sandbox Code Playgroud)

一种方法是

columns(M) = [ M[:,i] for i in 1:size(M, 2) ]
Run Code Online (Sandbox Code Playgroud)

但这将成为所有数据的昂贵副本.

为了避免这种情况,我们需要一个新的迭代器类型ColumnIterator,它返回切片?除了使用这个漂亮的语法之外,这会有用吗?

Rez*_*lan 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) ]

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