为什么[1:2]!=数组[1:2]

时间:2016-10-29 19:04:29

标签: arrays syntax julia

我正在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中没有看到的解释,我看了一下,但没找到。

1 个答案:

答案 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是另一个。另一组有趣的类型是特殊矩阵类型:为什么使用多个数组来存储DiagonalUniformScaling运算符充当单位矩阵,同时仅存储一个值(它的比例)以使A-kI有效。

由于Julia有一个健壮的类型系统,因此没有理由将所有这些东西都放在数组中。相反,你可以使它们成为一种特殊的类型,它将扮演(*+等)并像数组一样索引,但实际上并非如此。这将使他们占用更少的内存并加快速度。如果您需要阵列,只需拨打collect(A)full(A)即可。

我意识到你发布了一些更具体的东西。这里的原因是Array[1:2]调用数组的getindex函数。这个getindex函数在Range上有一个特殊的调度,因此它的行为类似于数组" (参见前面的讨论)。这就是特殊的#34;但实际上它只是像一个数组一样调度,就像它对其他所有函数一样。无论A是什么,[A]都会给出typeof(A)的数组,所以这里没有魔法。