types - 如何在 Julia 中定义任意浮点类型的数组?

标签 types julia

我试过了 Array{AbstractFloat,1} , 但这不适用于 Array{Float64,1} <: Array{AbstractFloat,1}false , 即使 Float64 <: AbstractFloattrue .

最佳答案

如果你想要一个可以包含任何类型浮点值的向量,那么正确的类型是 Vector{AbstractFloat} ,可以这样构造:

julia> v = AbstractFloat[]
AbstractFloat[]

julia> push!(v, 1.5)
1-element Vector{AbstractFloat}:
 1.5

julia> push!(v, big(2.0)^1000)
2-element Vector{AbstractFloat}:
 1.5
 1.071508607186267320948425049060001810561404811705533607443750388370351051124936e+301

julia> map(typeof, v)
2-element Vector{DataType}:
 Float64
 BigFloat

julia> push!(v, "oy, I'm not a float!")
ERROR: MethodError: Cannot `convert` an object of type String to an object

你是对的 Vector{Float64}不是 Vector{AbstractFloat} 的子类型.这是因为 Julia 中参数类型的子类型化是不变的(不是协变的,甚至不是逆变的)。更一般地说,没有具体类型是任何其他具体类型的子类型,并且 Vector{Float64}Vector{AbstractFloat}都是具体类型,因为它们是实际对象的类型:

julia> typeof(v)
Vector{AbstractFloat} = Array{AbstractFloat,1}

julia> typeof([1.5])
Vector{Float64} = Array{Float64,1}

如果您想要一个包含这两种具体类型以及任何其他浮点值向量的抽象类型,可以表示为 Vector{<:AbstractFloat} :

julia> Vector{AbstractFloat} <: Vector{<:AbstractFloat}
true

julia> Vector{Float64} <: Vector{<:AbstractFloat}
true

julia> Vector{Union{Float64, BigFloat}} <: Vector{<:AbstractFloat}
true

julia> Vector{String} <: Vector{<:AbstractFloat}
false

但是,这种类型是抽象的,您不能创建它的实例。但是,您可以使用它进行分派(dispatch)并编写一个适用于任何浮点值向量的方法:

f(v::Vector{<:AbstractFloat}) = "a vector of floats"
f(v::Vector) = "a vector but not of floats"
f(x::Any) = "not a vector at all"

下面是这个函数的作用:

julia> f(v)
"a vector of floats"

julia> f([1.5])
"a vector of floats"

julia> f(Union{Float64,BigFloat}[1.5, big(2.0)])
"a vector of floats"

julia> f([1, 2, 3])
"a vector but not of floats"

julia> f("nope")
"not a vector at all"

简而言之,向量的元素类型必须是实际类型,例如Float64。或 AbstractFloat .您可以将所有浮点向量的类型集表示为 Vector{<:AbstractFloat}但这不能是任何向量的类型,因为 <:AbstractFloat不是类型,它是类型的上限。但是,您可以使用 Vector{<:AbstractFloat}定义对任何浮点向量进行操作的方法,而不管特定的元素类型(只要元素类型是某种浮点)。

关于types - 如何在 Julia 中定义任意浮点类型的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62972685/

相关文章:

memory-management - 识别 Julia 中异常的内存分配

multidimensional-array - Julia 中的维度不匹配

dictionary - Go 中复杂键字典的唯一性,但 Julia 中没有?

C#: 类型名称 <type_name> 在类型 <type> 中不存在;在一个类中,调用另一个类的方法

haskell - 在 Haskell 中使用幻像类型验证程序的正确性

types - 什么是 "First Class"类型?

database - 如何在 JULIA 中使用 writecsv/writedlm 写入带标题的输出

c# - 如何获取每个表单的Text属性

list - 带有元组的 Haskell 类型

julia - Julia 中的可拖动轴 slider