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



将一些代码从v0.6.4转换为v1.0.1,我注意到v0.6.4中带有Array{Union{Float64, Missing}}的基本数学运算符的奇怪行为。我不确定这个问题仍然存在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(的正确类型,您建议做什么?

我找到了一个(相对(简单的解决方案来处理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}};

如前所述,这对朱莉娅0.7+来说不是问题,但对0.6.4来说是问题。

最新更新