Julia

时间:2015-07-05 22:08:33

标签: julia type-promotion

在Julia,我可以使用promote使各种类型的对象兼容。例如:

>promote(1, 1.0)
(1.0,1.0)
>typeof(promote(1, 1.0))
(Float64, Float64)

但是,如果我在数组上使用promote,它就无法提供我想要的内容:

>promote([1], [1.0])
([1],[1.0])
>typeof(promote([1], [1.0]))
(Array{Int64,1},Array{Float64,1})

我想要的是将Int64数组转换为Float64数组,所以我得到类似的结果:

>promote_array([1], [1.0])
([1.0],[1.0])
>typeof(promote_array([1], [1.0]))
(Array{Float64,1},Array{Float64,1})

这里promote_array是我编写的假设函数。我正在寻找一个能够做同样事情的真正功能。 Julia中是否有一个函数执行上面promote_array所做的事情?

2 个答案:

答案 0 :(得分:4)

以下是我要做的事情:

function promote_array{S,T}(x::Vector{S},y::Vector{T})
    U = promote_type(S,T)
    convert(Vector{U},x), convert(Vector{U},y)
end

我不确定你的用例究竟是什么,但我认为以下模式对于那些通用性能最严格的代码通常是必需的:

function foo{S<:Real, T<:Real}(x::Vector{S},y::Vector{T})
    length(x) != length(y) && error("Length mismatch")
    result = zeros(promote_type(S,T), length(x))
    for i in 1:length(x)
        # Do some fancy foo-work here
        result[i] = x[i] + y[i]
    end
    return result
end

答案 1 :(得分:3)

我找到了函数Base.promote_eltype,我可以用它来得到我想要的东西:

function promote_array(arrays...)
  eltype = Base.promote_eltype(arrays...)
  tuple([convert(Array{eltype}, array) for array in arrays]...)
end

这个promote_array函数然后给我输出我正在寻找:

>promote_array([1], [1.0])
([1.0],[1.0])
>typeof(promote_array([1], [1.0]))
(Array{Float64,1},Array{Float64,1})

以上解决了我的问题,虽然Base.promote_eltype的存在表明可能已经建立了一个我还不了解的解决方案。