在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
所做的事情?
答案 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
的存在表明可能已经建立了一个我还不了解的解决方案。