@@ -144,10 +144,18 @@ for (f1, f2, initval) in ((:min, :max, :Inf), (:max, :min, :(-Inf)))
144
144
# otherwise use the min/max of the first slice as initial value
145
145
v0 = mapreduce (f, $ f2, A1)
146
146
147
- # but NaNs need to be avoided as initial values
148
- v0 = v0 != v0 ? typeof (v0)($ initval) : v0
149
-
150
147
T = _realtype (f, promote_union (eltype (A)))
148
+
149
+ # but NaNs and missing need to be avoided as initial values
150
+ if (v0 != v0) === true
151
+ v0 = typeof (v0)($ initval)
152
+ elseif ismissing (v0)
153
+ # If it's a union type, pick the initval from the other type.
154
+ if typeof (T) == Union
155
+ v0 = (T. a == Missing ? T. b : T. a)($ initval)
156
+ end
157
+ end
158
+
151
159
Tr = v0 isa T ? T : typeof (v0)
152
160
return reducedim_initarray (A, region, v0, Tr)
153
161
end
@@ -926,7 +934,7 @@ function findminmax!(f, Rval, Rind, A::AbstractArray{T,N}) where {T,N}
926
934
for i in axes (A,1 )
927
935
k, kss = y:: Tuple
928
936
tmpAv = A[i,IA]
929
- if tmpRi == zi || (tmpRv == tmpRv && (tmpAv != tmpAv || f (tmpAv, tmpRv)) )
937
+ if tmpRi == zi || f (tmpRv, tmpAv )
930
938
tmpRv = tmpAv
931
939
tmpRi = k
932
940
end
@@ -943,7 +951,7 @@ function findminmax!(f, Rval, Rind, A::AbstractArray{T,N}) where {T,N}
943
951
tmpAv = A[i,IA]
944
952
tmpRv = Rval[i,IR]
945
953
tmpRi = Rind[i,IR]
946
- if tmpRi == zi || (tmpRv == tmpRv && (tmpAv != tmpAv || f (tmpAv, tmpRv)) )
954
+ if tmpRi == zi || f (tmpRv, tmpAv )
947
955
Rval[i,IR] = tmpAv
948
956
Rind[i,IR] = k
949
957
end
@@ -963,7 +971,7 @@ dimensions of `rval` and `rind`, and store the results in `rval` and `rind`.
963
971
"""
964
972
function findmin! (rval:: AbstractArray , rind:: AbstractArray , A:: AbstractArray ;
965
973
init:: Bool = true )
966
- findminmax! (isless , init && ! isempty (A) ? fill! (rval, first (A)) : rval, fill! (rind,zero (eltype (keys (A)))), A)
974
+ findminmax! (isgreater , init && ! isempty (A) ? fill! (rval, first (A)) : rval, fill! (rind,zero (eltype (keys (A)))), A)
967
975
end
968
976
969
977
"""
@@ -996,13 +1004,11 @@ function _findmin(A, region)
996
1004
end
997
1005
(similar (A, ri), zeros (eltype (keys (A)), ri))
998
1006
else
999
- findminmax! (isless , fill! (similar (A, ri), first (A)),
1007
+ findminmax! (isgreater , fill! (similar (A, ri), first (A)),
1000
1008
zeros (eltype (keys (A)), ri), A)
1001
1009
end
1002
1010
end
1003
1011
1004
- _isgreater (a, b) = isless (b,a)
1005
-
1006
1012
"""
1007
1013
findmax!(rval, rind, A) -> (maxval, index)
1008
1014
@@ -1012,7 +1018,7 @@ dimensions of `rval` and `rind`, and store the results in `rval` and `rind`.
1012
1018
"""
1013
1019
function findmax! (rval:: AbstractArray , rind:: AbstractArray , A:: AbstractArray ;
1014
1020
init:: Bool = true )
1015
- findminmax! (_isgreater , init && ! isempty (A) ? fill! (rval, first (A)) : rval, fill! (rind,zero (eltype (keys (A)))), A)
1021
+ findminmax! (isless , init && ! isempty (A) ? fill! (rval, first (A)) : rval, fill! (rind,zero (eltype (keys (A)))), A)
1016
1022
end
1017
1023
1018
1024
"""
@@ -1045,7 +1051,7 @@ function _findmax(A, region)
1045
1051
end
1046
1052
similar (A, ri), zeros (eltype (keys (A)), ri)
1047
1053
else
1048
- findminmax! (_isgreater , fill! (similar (A, ri), first (A)),
1054
+ findminmax! (isless , fill! (similar (A, ri), first (A)),
1049
1055
zeros (eltype (keys (A)), ri), A)
1050
1056
end
1051
1057
end
0 commit comments