我正在Wikibook之后学习Julia,但我不明白为什么以下两个命令会产生不同的结果:
julia> [1:2]
1-element Array{UnitRange{Int64},1}:
1:2
julia> Array[1:2]
1-element Array{Array,1}:
[1,2]
道歉,如果有一个我在Wikibook中没有看到的解释,我看了一下,但没找到。
答案 0 :(得分:6)
类型[a]在元素上运行转换,并且在Range到数组(collect)之间有一个简单的转换。所以Array[1:2]
将1:2
转换为数组,然后创建一个这样的对象数组。这与Float64 [1; 2; 3]为Float64数组的原因相同。
a:b
不是数组,而是UnitRange
。为什么要为A = a:b
创建数组?它只需要两个数字来存储它,您可以基本免费为任何A[i]
计算i
。使用数组会占用与b-a
成比例的内存量,因此对于较大的数组,需要花费大量时间进行分配,而UnitRange
的分配基本上是免费的。
Julia中的这些类型称为惰性迭代器。 LinSpace是另一个。另一组有趣的类型是特殊矩阵类型:为什么使用多个数组来存储Diagonal
? UniformScaling
运算符充当单位矩阵,同时仅存储一个值(它的比例)以使A-kI
有效。
由于Julia有一个健壮的类型系统,因此没有理由将所有这些东西都放在数组中。相反,你可以使它们成为一种特殊的类型,它将扮演(*
,+
等)并像数组一样索引,但实际上并非如此。这将使他们占用更少的内存并加快速度。如果您需要阵列,只需拨打collect(A)
或full(A)
即可。
我意识到你发布了一些更具体的东西。这里的原因是Array[1:2]
调用数组的getindex
函数。这个getindex
函数在Range
上有一个特殊的调度,因此它的行为类似于数组" (参见前面的讨论)。这就是特殊的#34;但实际上它只是像一个数组一样调度,就像它对其他所有函数一样。无论A是什么,[A]
都会给出typeof(A)
的数组,所以这里没有魔法。