#variables #type-conversion #julia
#переменные #преобразование типа #джулия
Вопрос:
Я пытаюсь оптимизировать свой код Julia, сделав его стабильным по типу. Следовательно, я попытался объявить типы переменных в заголовках функций. Но одна из переменных имеет тип ::SentinelArrays.ChainedVector{Float64,Array{Float64,1}}
, как показано во фрагменте кода ниже.
Пример кода:
df=CSV.read("text.csv", DataFrame)
a = view(df, :, 1)
#this has a type of ::SentinelArrays.ChainedVector{Float64,Array{Float64,1}}
b = view(df, :, 2:4)
#while type of this is ::Arrays{Float64,2}
#I would like to pass the type of the arrays in the function.
function calc(a, b::Arrays{Float64,2})
a b
end
Однако я попытался передать typeof(a)
в function
calc(a::SentinelArrays.ChainedVector{Float64,Array{Float64,1}}, b::Arrays{Float64,2})
, это выдает ошибку no method matching
.
Могу ли я узнать правильный способ присвоения этого типа или, может быть, если можно преобразовать это в обычный Array{Float64,1}
.
Пожалуйста, предложите решение этой проблемы. Заранее спасибо.
Комментарии:
1. Черт возьми, я не думаю, что аннотирование типов аргументов вашей функции поможет повысить стабильность типов. Как правило, я думаю, что лучше всего аннотировать эти типы только тогда, когда у вас есть несколько методов и вы используете множественную отправку.
Ответ №1:
Вы можете просто написать Array(a)
, где a
ваш SentinelArray
as здесь:
julia> u = SentinelArray(rand(1:8,4))
4-element SentinelVector{Int64, Int64, Missing, Vector{Int64}}:
2
3
5
3
julia> Array(u)
4-element Vector{Union{Missing, Int64}}:
2
3
5
3
Однако обычно вы просто делаете сигнатуру функции примерно такой:
function calc(a, b::AbstractArray{T,2}) where T
потому что это будет работать с обоими этими типами:
julia> SentinelMatrix{Int64, Int64, Missing, Matrix{Int64}} <: AbstractArray{T,2} where T
true