Julia 类型

                     

贡献者: 待更新

   本文授权转载自郝林的 《Julia 编程基础》。原文链接:第 9 章 容器:数组(上)

9.1 类型

   代表数组的具体类型名为 Array,它是 AbstractArray 的直接子类型。Julia 针对 AbstractArray 类型定义了大量且丰富的操作。因而,Array 类型也就很自然地成为了这些操作的有效目标。

   我们已经知道,Array 是一个参数化类型,它的全名是 Array{T,N}。其中的类型参数 T 用于确定数组的元素类型,而类型参数 N 则用于确定数组的维数。这里的 N 的取值通常是一个正整数(也可以是 0,表示零维数组)。并且,在 64 位的计算机系统中,它的值不能超出 Int64 类型所能表示的数值范围;在 32 位的计算机系统中,它的值不能超出 Int32 类型所能表示的数值范围。下面是一些示例:

julia> Array{Float64,3}
Array{Float64,3}

julia> Array{Int64,N} where N
Array{Int64,N} where N

julia> Array{Int64}
Array{Int64,N} where N

julia> Array{T,typemax(Int32)} where T
Array{T,2147483647} where T

julia>

   在一般情况下,我们直接使用的数组的维数都不会太多,大多在三维及以下。尽管在一些程序中可能会用到拥有更多维度的数组,但其维数肯定也比 Int32 类型所能表示的最大值要小得多。所以,这里的类型参数 N 的取值范围对于我们来说相当于没有限制。

   正因为一维数组和二维数组都太常用了,所以 Julia 为它们的类型提供了别名。别名 Vector{T} 代表类型 Array{T,1},也就是一维数组的类型。而别名 Matrix{T} 则代表了 Array{T,2},即二维数组的类型。其中的 vector(向量)和 matrix(矩阵)都是线性代数中最核心的概念。从形状上来讲,向量就是由一个个值组成的纵队,而矩阵则是由一个个长度相同的纵队组成的方阵。

   顺便说一下,我们在本书中不会专门去讨论相关的数学知识。但是,我们有时候(尤其是讲数组的时候)却不得不提到一点,因为有些对象及其操作基于的正是那些数学概念。不过别担心,我会尽量用精炼、朴实的语言去描述它们。

   我们再来说数组类型的其他特点。与元组类型不同,数组类型的字面量永远也无法体现出元素的顺序。这主要是因为数组类型中只有一个可以代表元素类型的参数。想想看,如果一个元组类型的所有参数值全都相同,那么它同样无法体现出元素的顺序。

   另外,数组类型也无法体现出其元素的数量。因此,对于一个一维数组,我们可以随意地增减其中的元素值,而不用担心不符合其类型的约束。如:

julia> isa([1], Array{Int64,1})
true

julia> isa([1,2,3], Array{Int64,1})
true

julia> isa([1,2,3,4,5], Array{Int64,1})
true

julia>

   然而,对于多维数组来说,其各个维度上的元素数量却不是随意的。更确切地说,在一个多维数组中,处在同一个维度上的所有低维数组(即维数更低的数组)都应该具有相同的尺寸。这就好比一个方阵,其中的所有纵队的长度都需要相同。又好比一个六面体,它的每一个面都应该是平面,既不能有任何的凹陷,也不能有任何的凸出。只有符合这种规则的数组才能被称为多维数组,其类型如 Array{Int64,2}。否则,那个数组就只能算是多个数组的嵌套而已,其类型如 Array{Array{Int64,1},1}

   除了类型字面量上的一些特点,数组类型还具有非转化的特性。因此,[][1] 虽然同为一维数组,但是它们的类型之间却不存在继承关系。这是由于空数组 [] 的类型是 Array{Any,1},它不是 Array{Int64,1} 的超类型。验证的代码如下:

julia> typeof([1]) <: typeof([])
false

julia> Array{Int64,1} <: Array{Any,1}
false

julia>

   到这里,我们知道了 Array{T,N} 类型中各个类型参数的取值范围,还知道了最常用的一维数组和二维数组的类型别名。另外,我们还了解到,数组类型的字面量上只会体现它的元素类型和维数,而不会体现元素的顺序以及各个维度上的元素数量。尽管如此,多维数组在各个维度上的元素数量仍需满足既定的规则,否则就不能被称为多维数组,而只能算是多个数组的嵌套。这可能看起来比较抽象,不过没有关系,我们在后面会把数组的值与它们的类型放在一起进行解读。

   最后,再次强调,数组类型具有非转化的特性。


致读者: 小时百科一直以来坚持所有内容免费,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 10 元,我们一个星期内就能脱离亏损, 并保证在接下来的一整年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利