我对数组的不同类型感到困惑。考虑这两个例子
a = Array{Float64}[]
push!(a,[1, 2])
push!(a,[3, 4])
push!(a,[1 2; 3 4])
b = Array[[1.0, 2.0], [3.0,4.0], [1.0 2.0; 3.0 4.0]]
我不确定如何a
和b
不同。假设我打算对a
或中的b
每个元素运行一个for循环,并将每个元素乘以2。即,
for i in 1:3 a[i] = a[i]*2 end
for i in 1:3 b[i] = b[i]*2 end
我分别为两条线的运行时间计时,但是它们的速度一样快。是a
和b
一样吗?如果是这样,为什么a
还要存在呢?它看起来相当复杂,因为会typeof(a)
产生“ Array {Array {Array {Float64,N}其中N,1}”。where
在这里做什么?
两个a
和b
是矢量,但它们允许不同类型的元件。您可以通过以下方式进行检查:
julia> typeof(a)
Array{Array{Float64,N} where N,1}
julia> typeof(b)
Array{Array,1}
现在Array
是具有两个参数的参量类型。第一个参数是它允许的元素类型。第二个参数是尺寸。您会看到,在这两种情况下,维都是1
,表示维a
和b
是向量。您也可以使用以下ndims
功能对其进行检查:
julia> ndims(a)
1
julia> ndims(b)
1
第一个参数是允许的元素类型。在a
它的情况下,Array{Float64,N} where N
而在b
公正的情况下Array
。在解释如何阅读它们之前,请注意可以使用以下eltype
函数提取第一个参数:
julia> eltype(a)
Array{Float64,N} where N
julia> eltype(b)
Array
您可以看到两者a
并b
允许Array
对其进行存储。首先让我解释一下如何阅读Array{Float64, N} where N
。这意味着a
可以存储Float64
任何尺寸的数组。实际上,您可以用以下较短的方式编写代码,Array{Float64}
因为您可以检查以下内容:
julia> (Array{Float64,N} where N) === Array{Float64}
true
原因是,如果不对tail参数施加限制,则可以在语法上删除它。该where N
部分是对参数的限制。在这种情况下,对第二个参数没有限制。
现在我们可以转向b
。您会看到它eltype
是just Array
,因此两个参数都被删除,因此如上所述对它们没有任何限制。因此Array
,与Array{T, N} where {T,N}
您在此处看到的相同:
julia> (Array{T, N} where {T,N}) === Array
true
因此,区别在于a
可以存储任何维度的数组,但它们必须具有Float64
元素类型,而b
可以存储任何维度和任何元素类型的数组。这种区别,在这种情况下,具有如你已经注意到性能没有影响,但将有什么可以存储在冲击a
和b
。这里有些例子。
在这种情况下,它们的工作方式与您尝试将Int
它们存储在其中的方式相同,但是它们只允许使用数组:
julia> a[1] = 1
ERROR: MethodError: Cannot `convert` an object of type
julia> b[1] = 1
ERROR: MethodError: Cannot `convert` an object of type
但在这里它们有所不同:
julia> a[1] = ["a"]
ERROR: MethodError: Cannot `convert` an object of type String to an object of type Float64
julia> b[1] = ["a"]
1-element Array{String,1}:
"a"
julia> a
3-element Array{Array{Float64,N} where N,1}:
[1.0, 2.0]
[3.0, 4.0]
[1.0 2.0; 3.0 4.0]
julia> b
3-element Array{Array,1}:
["a"]
[3.0, 4.0]
[1.0 2.0; 3.0 4.0]
如您所见,您可以存储String
in的数组b
,但是不允许将其存储在中a
。
另外两个评论(两个主题都比较复杂,因此我省略了详细信息,但只是提示您发生了什么):
julia> [[1.0, 2.0], [3.0,4.0], [1.0 2.0; 3.0 4.0]]
3-element Array{Array{Float64,N} where N,1}:
[1.0, 2.0]
[3.0, 4.0]
[1.0 2.0; 3.0 4.0]
选择数组的元素类型对性能的影响取决于以下事实:
isabstracttype
;可以通过编译器进行的这种影响类型推断来检查),isbitstype
;进行检查,这会影响存储布局),Union
(可以更有效地处理小并集)。在您的情况下,两种元素类型都是抽象位和非位,因此性能将相同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句