Julia-数学运算符和数组{Union {Float64,Missing}}

时间:2018-10-25 14:35:38

标签: julia

将一些代码从v0.6.4转换为v1.0.1,我注意到Array{Union{Float64, Missing}}中带有v0.6.4的基本数学运算符的奇怪行为。我不确定v0.7+的问题仍然存在。我想找到一个适用于v0.6.4的解决方案,以便可以将代码输出与其当前工作版本进行比较。

假设我有

using Missings;
A = Array{Union{Float64, Missing}}([2.0 1.0 missing]);
B = [2.0 1.0 0.5];

v0.6.4中,总和A+B和逐元素总和A.+B给出了一个输出矩阵Array{Any,2}。我期待一个Array{Union{Float64, Missing},2},因为总和的第一个参数就是这种类型。同样适用于其他基本数学运算。

我发现A+B有一个丑陋的解决方法,但对于元素和A.+B却没有。您建议怎么做才能为两个操作(和类似的操作,例如A.-B)获取正确的类型?

1 个答案:

答案 0 :(得分:0)

我找到了一个(相对)简单的解决方案来处理A.+B。我为sum运算符定义了一个临时广播方法,该方法将Base.Broadcast.broadcast_c的输出转换为Array{Union{T, Missing}}

import Base: +, broadcast, Broadcast.broadcast_c, Broadcast.containertype;


broadcast(+, A::Array{Union{T, Missing}}, B::Array{T}) where {T<:Number} =
        broadcast_c(+, containertype(A, B), A, B) |> Array{Union{T, Missing}};

broadcast(+, A::Array{T}, B::Array{Union{T, Missing}}) where {T<:Number} =
    broadcast_c(+, containertype(A, B), A, B) |> Array{Union{T, Missing}};

broadcast(+, A::Array{Union{T, Missing}}, B::Array{Union{T, Missing}}) where {T<:Number} =
    broadcast_c(+, containertype(A, B), A, B) |> Array{Union{T, Missing}};

如前所述,这对Julia 0.7+来说不是问题,但对0.6.4来说则是问题。