Julia:无需循环即可将 Vector 转换为多个 m x n 矩阵

Julia: Turn Vector into multiple m x n matrices without a loop

假设我有一个向量 V,我想将这个向量转换成多个 m x n 矩阵,或者从这个向量 V 中得到多个 m x n 矩阵。 对于最基本的示例:将 V = collect(1:75) 转换为 3 5x5 个矩阵。

据我所知,这可以通过首先使用 reshape reshape(V, 5, :) 然后循环遍历它来完成。在 Julia 中有没有更好的不使用循环的方法?

如果可能,可以轻松地在行优先和列优先结果之间切换的解决方案是可取的。

TL:DR

m, n, n_matrices = 4, 2, 5
V = collect(1:m*n*n_matrices)
V = reshape(V, m, n, :)
V = permutedims(V, [2,1,3])
display(V)

根据我对 Julia 的有限了解:

执行V = collect(1:m*n)时,您在内存中初始化了一个连续的数组。从 V 开始,您希望通过 n 矩阵创建一个包含 m 的容器。您可以通过执行 reshape(V, m, n, :) 来实现此目的,然后您可以使用 V[:,:,1] 访问第一个矩阵。本例中的“容器”只是另一个数组(因此你有一个三维数组),在本例中我们将其解释为“矩阵数组”(但你也可以将其解释为一个盒子)。然后,您可以通过像这样交换前两个维度来转置数组中的每个矩阵:permutedims(V, [2,1,3]).

这是如何工作的

据我了解;当您不进行任何“跳过”(例如 V[1:2:end])时,Julia 中的 n 维数组是内存中的连续数组。例如 2 x 4 矩阵 A:

1 3 5 7
2 4 6 8

在内存中只是 1 2 3 4 5 6 7 8。您只需以特定方式解释数据,其中前两个数字构成第一列,然后后两个数字构成下一列,依此类推。 reshape 函数只是指定您要如何解释内存中的数据。因此,如果我们执行 reshape(A, 4, 2),我们基本上将内存中的数字解释为“前四个值构成第一列,后四个值构成第二列”,我们将得到:

1 5
2 6
3 7
4 8

我们基本上在这里做同样的事情,但有一个额外的维度。

根据我的观察,在这种情况下 permutedims 似乎也重新分配了内存。另外,如果我错了,请随时纠正我。

旧答案:

我不太了解 Julia,但在 Python 使用 NumPy 时我会做这样的事情:

reshape(V, :, m, n)

编辑:正如@BatWannaBe 所述,结果在技术上是一个数组(但是三维的)。您总是可以将三维数组解释为二维数组的容器,根据我的理解,这正是您所要求的。