簡體   English   中英

如何在 Julia 中定義任意浮點類型的數組?

[英]How to define an array of any float type in 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

但是,這種類型是抽象的,您不能創建它的實例。 但是,您可以使用它進行調度並編寫一個適用於任何浮點值向量的方法:

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"

這是 function 的實際操作:

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"

簡而言之,向量的元素類型必須是實際類型,例如Float64AbstractFloat 您可以將所有浮點向量的類型集表示為Vector{<:AbstractFloat}但這不能是任何向量的類型,因為<:AbstractFloat不是類型,它是類型的上限。 但是,您可以使用Vector{<:AbstractFloat}來定義對任何浮點向量進行操作的方法,而不管特定的元素類型如何(只要元素類型是某種浮點數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM