gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:54:45 25 4
gpt4 key购买 nike

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

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

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

如果有我在维基书中没有看到的解释,我深表歉意,我简单地浏览了一下,但没有找到。

最佳答案

Type[a] 对元素运行转换,并且在范围到数组之间有一个简单的转换(收集)。因此,Array[1:2]1:2 转换为数组,然后创建一个类似的对象数组。这与为什么 Float64[1;2;3] 是 Fl​​oat64 的数组是同一件事。

<小时/>

前面的部分回答了错误的问题。哎呀...

a:b 不是一个数组,它是一个 UnitRange。为什么要为 A = a:b 创建数组?只需要两个数字来存储它,并且基本上可以免费计算任何iA[i]。使用数组将占用与 b-a 成正比的内存量,因此对于较大的数组将需要大量时间来分配,而 UnitRange 的分配本质上是免费。

Julia 中的这些类型称为惰性迭代器。 LinSpace 是另一个。另一组有趣的类型是特殊的矩阵类型:为什么不使用数组来存储对角线? UniformScaling 运算符充当单位矩阵,同时仅存储一个值(即比例),以提高 A-kI 效率。

由于 Julia 拥有强大的类型系统,因此没有理由将所有这些东西都做成数组。相反,您可以将它们设为特殊类型,其行为(*+ 等)和索引类似于数组,但实际上并非如此。这将使它们占用更少的内存并且速度更快。如果您需要该数组,只需调用 collect(A)full(A) 即可。

<小时/>

我意识到您发布了一些更具体的内容。这里的原因是 Array[1:2] 调用数组的 getindex 函数。这个 getindex 函数在 Range 上有一个特殊的调度,这样它“就像由数组索引一样”(请参阅​​前面的讨论)。所以这是“特殊情况”,但实际上它只是像数组一样进行调度,就像它对所有其他函数所做的那样。 [A] 给出一个 typeof(A) 数组,无论 A 是什么,所以这里没有魔法。

<小时/>

关于arrays - 为什么[1 :2] ! = 数组[1:2],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40322616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com