将一些代码从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
)获取正确的类型?
答案 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
来说则是问题。