多维数组

Julia 内置数组的类型名为 Array。不同于一些语言中只定义了类似 Vector 的结构,Julia 中的数组可以定义成任意维的。

类型

julia> Vector # 一维数组 Vector 是数组的特例
Vector{T} where T (alias for Array{T, 1} where T)

julia> Array{Int, 3}(undef, 2, 2, 2) # 生成一个未初始化的 2×2×2 数组
2×2×2 Array{Int64, 3}:
[:, :, 1] =
 272741312  284121296
 272741312  284121296

[:, :, 2] =
 272755984  287668496
 272755984  426754624

julia> Matrix # 二维数组 Matrix 是数组的特例
Matrix{T} where T (alias for Array{T, 2} where T)

需要注意,数组的数组 Vector{Vector} 与二维数组 Matrix 是不同的。

一些静态语言中默认的数组都是不可变长数组,进行区分无太大意义,但在 Julia 中这有很大的区别。例如:数组的数组 [[], [0], [0, 1]],它的各个元素(是数组)的长度可以是不同的,而 Matrix 则无法做到这一点。

字面量

julia> v = [1 2 3] # 注意:生成的也是二维数组
1×3 Matrix{Int64}:
 1  2  3

julia> v = [1 2 3 ; 4 5 6 ; 7 8 9] # 二维数组
3×3 Matrix{Int64}:
 1  2  3
 4  5  6
 7  8  9

julia> [1 2 ; 3 4 ;;; 5 6 ; 7 8] # 在 Julia 1.7 以后,3 维或更多维的数组可以被字面量表示。
2×2×2 Array{Int64, 3}:
[:, :, 1] =
 1  2
 3  4

[:, :, 2] =
 5  6
 7  8

julia> [1 2 ;;;; 3 4]
1×2×1×2 Array{Int64, 4}:
[:, :, 1, 1] =
 1  2

[:, :, 1, 2] =
 3  4

此语法也可用于拼接多维数组

julia> const a, b, c = fill(1, 1, 2, 1, 2), fill(2, 2, 2, 1, 2), fill(3, 3, 2, 1, 3);

julia> [a ; b ;;;; c]
3×2×1×5 Array{Int64, 4}:
[:, :, 1, 1] =
 1  1
 2  2
 2  2

[:, :, 1, 2] =
 1  1
 2  2
 2  2

[:, :, 1, 3] =
 3  3
 3  3
 3  3

[:, :, 1, 4] =
 3  3
 3  3
 3  3

[:, :, 1, 5] =
 3  3
 3  3
 3  3

索引

多维数组也可通过下标访问,在 [] 中填充所有维度的参数。

julia> v[3, 2]
8

julia> v[2:3, 2:3] # 通过范围访问
2×2 Matrix{Int64}:
 5  6
 8  9

julia> v[1, 1] = 0 # 通过下标修改
0

杂项

julia> size(v) # 各维度长度
(1, 3)

julia> size(v, 1) # 第一维长度
1

julia> mat = Matrix(undef, 0, 0)
0×0 Matrix{Any}

julia> mat == [[]]
false