我正在学习朱莉娅跟随维基本,但我不明白为什么以下两个命令给出了不同的结果:
julia> [1:2]
1-element Array{UnitRange{Int64},1}:
1:2
julia> Array[1:2]
1-element Array{Array,1}:
[1,2]
很抱歉,如果我还没有在维基百科上看到一个解释的话,我只是简单地看了一下,但没有找到。
发布于 2016-10-29 19:18:44
Typea在元素上运行转换,在范围到数组(collect)之间有一个简单的转换。因此,Array[1:2]
将1:2
转换为数组,然后生成这样的对象数组。这与Float64 641;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是什么,[A]
都会给出一个typeof(A)
数组,所以这里没有魔法。
https://stackoverflow.com/questions/40322616
复制相似问题