数组数组的预分配

Pre-allocation of array of array

在 julia 中,可以使用

预分配给定 typedims 的数组
A = Array{<type>}(undef,<dims>)

10x10 浮点矩阵示例

A = Array{Float64,2}(undef,10,10)

但是,对于数组预分配的数组,似乎无法为底层数组提供预分配。 例如,如果我想初始化一个由 n 复数浮点矩阵组成的向量,我只能想出这个语法,

A = Vector{Array{ComplexF64,2}}(undef, n)

但是我怎么能预先分配向量中每个数组的大小,除非之后有一个循环?我试过

A = Vector{Array{ComplexF64,2}(undef,10,10)}(undef, n)

这显然行不通。

请记住,“分配”的意思是“给我一个连续的内存块,大小刚好 blah”。对于数组的数组,它实际上是指向其他连续块的连续指针块,这通常作为组合操作实际上没有意义——后面的块可能完全不同。

但是,通过陈述您的问题,您清楚地表明您实际上有更多的结构信息:您知道您有 n 10x10 数组。从概念上讲,这确实是一个 3D 数组:

A =  Array{Float64}(undef, n, 10, 10)

到那时,你可以只取切片,或者更好:沿第一个轴的视图,如果你需要它们的数组:

[@view A[i, :, :] for i in axes(A, 1)]

这是 AbstractArrays 的长度 n 数组,在所有方面都像您想要的单个 10x10 数组。

在您所描述的情况下,您需要使用理解:

a = [Matrix{ComplexF64}(undef, 2,3) for _ in 1:4]

这会分配 VectorArray。在 Julia 的理解中,您可以迭代更多维度,因此也可以使用更高维度。