两种不同类型的数组

用户名

我对数组的不同类型感到困惑。考虑这两个例子

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]]

我不确定如何ab不同。假设我打算对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

我分别为两条线的运行时间计时,但是它们的速度一样快。ab一样吗?如果是这样,为什么a还要存在呢?它看起来相当复杂,因为会typeof(a)产生“ Array {Array {Array {Float64,N}其中N,1}”。where在这里做什么

BogumiłKamiński

两个ab是矢量,但它们允许不同类型的元件。您可以通过以下方式进行检查:

julia> typeof(a)
Array{Array{Float64,N} where N,1}

julia> typeof(b)
Array{Array,1}

现在Array是具有两个参数的参量类型第一个参数是它允许的元素类型。第二个参数是尺寸。您会看到,在这两种情况下,维都是1,表示ab是向量。您也可以使用以下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

您可以看到两者ab允许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可以存储任何维度和任何元素类型的数组。这种区别,在这种情况下,具有如你已经注意到性能没有影响,但将有什么可以存储在冲击ab这里有些例子。

在这种情况下,它们的工作方式与您尝试将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]

如您所见,您可以存储Stringin的数组b,但是不允许将其存储在中a

另外两个评论(两个主题都比较复杂,因此我省略了详细信息,但只是提示您发生了什么):

  1. 定义数组时,不得指定数组的元素类型。在这种情况下,Julia将自动选择其元素类型:
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]
  1. 选择数组的元素类型对性能的影响取决于以下事实:

    1. 如果类型是抽象的(可以通过isabstracttype可以通过编译器进行的这种影响类型推断来检查),
    2. 如果是位类型(可以通过isbitstype;进行检查,这会影响存储布局),
    3. 如果元素类型为Union(可以更有效地处理小并集)。

在您的情况下,两种元素类型都是抽象位和非位,因此性能将相同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从两种不同类型的数组获取公共数据

通过TCP发送两种不同类型的数组

对两种不同类型的 Numpy 数组进行排序

这是在两种不同类型的数组之间进行转换的最佳方法吗?

如何在Swift中为UITableView处理数组中的两种不同类型

断言两种不同类型的枚举是等效的

Django-两种不同类型用户的信号

两种不同类型的进程列表

两种不同类型的日期比较,Python 3.6

恰好两种不同类型的扩展方法

接受两种不同类型作为参数的方法

F#两种不同类型的函数参数

管理两种不同类型数据的单个变量

两种不同类型的OCaml递归函数

Angular 存在两种不同类型的同名

如何区分两种不同类型的哈希表

这是两种不同类型的枚举吗?

Googlemap JS中两种不同类型的标记

如何检测两种不同类型的权限

如何同时使用两种不同类型的存储

我可以只用一种类型的变量在两种不同类型的数组中搜索值吗?

如何给btw数组元素一个空格或一个空格,以显示两种不同类型的数组

比较javascript或jquery中的两种不同的数组类型

两种不同对象类型的多维数组

在Elasticsearch中搜索具有不同映射的两种不同类型

Django使用不同的字段注册两种不同类型的用户

在C ++函数中返回两种不同类型的两个值

是否可以从进入 map/flatMap 的 Observable 返回两种不同类型的类型?

模板类C ++中两种不同类型的方法