将一些代码从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
来说是问题。