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

She*_*ohn 7 arrays syntax julia

我正在学习Julia跟随Wikibook,但我不明白为什么以下两个命令给出不同的结果:

julia> [1:2]
1-element Array{UnitRange{Int64},1}:
 1:2

julia> Array[1:2]
1-element Array{Array,1}:
 [1,2]
Run Code Online (Sandbox Code Playgroud)

道歉,如果有一个我在Wikibook中没有看到的解释,我看了一下,但没有找到.

Chr*_*kas 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因此它"就像它被数组索引一样"(参见前面的讨论).所以这是"特殊的",但实际上它只是像一个数组一样调度就像它与其他所有函数一样.[A]给出了一个typeof(A)无论A是什么的数组,所以这里没有魔法.