数组的预分配

4
在Julia中,可以使用以下代码预先分配给定typedims的数组:
A = Array{<type>}(undef,<dims>)

一个10行10列的浮点数矩阵的示例

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)

显然这是行不通的。

2个回答

3
请注意,“allocate”的含义是“给我一个连续的内存块,大小恰好为blah”。对于数组中的数组(实际上是指向其他连续块的指针的连续块),这通常不适用于组合操作——后面的块可能完全不同。
然而,通过说明您的问题,您明确表明您实际上拥有更多的结构信息:您知道您有n个10x10数组。从概念上讲,这确实是一个3D数组:
A =  Array{Float64}(undef, n, 10, 10)

此时,您只需获取数组的切片或更好的方式是沿第一轴获取视图,如果您需要一个它们的数组:

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

这是一个长度为n的数组,其中每个元素都表现得像你想要的10x10单独数组一样,它们的性质与之相同。


A 定义为 Array{Float64}(undef, 10, 10, n) 并循环第三个维度是否更有意义,因为 Julia 是列优先的顺序? - BambOo
1
我同意,从效率的角度来看,那可能更好。 - phipsgabler
1
我刚刚注意到你甚至可以使用EllipsisNotation.jl来实现这个:A[.., i] - phipsgabler

2
在您所描述的情况下,您需要使用理解(comprehension):
a = [Matrix{ComplexF64}(undef, 2,3) for _ in 1:4]

这将分配一个由Array组成的Vector。在Julia的推导式中,您可以迭代更多维度,因此高维度也可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接