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]
道歉,如果有一个我在Wikibook中没有看到的解释,我看了一下,但没有找到.
类型[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是什么的数组,所以这里没有魔法.