@@ -2,13 +2,15 @@ using Statistics
2
2
3
3
function Statistics. varm (A:: AbstractGPUArray{<:Real} , M:: AbstractArray{<:Real} ;
4
4
dims, corrected:: Bool = true )
5
+ T = float (eltype (A))
6
+ λ = convert (T, inv (_mean_denom (A, dims) - corrected))
5
7
# B = (A .- M).^2
6
8
# NOTE: the above broadcast promotes to Float64 and uses power_by_squaring...
7
- B = broadcast (A, M) do a, m
9
+ B = Broadcast . broadcasted (A, M) do a, m
8
10
x = (a - m)
9
- x * x
11
+ λ * x * x
10
12
end
11
- sum (B, dims= dims) / ( prod ( size (A)[[dims ... ]]) :: Int - corrected )
13
+ sum (Broadcast . instantiate (B); dims)
12
14
end
13
15
14
16
Statistics. stdm (A:: AbstractGPUArray{<:Real} ,m:: AbstractArray{<:Real} , dim:: Int ; corrected:: Bool = true ) =
@@ -23,8 +25,17 @@ Statistics._std(A::AbstractGPUArray, corrected::Bool, mean, ::Colon) =
23
25
# Revert https://github.com/JuliaLang/Statistics.jl/pull/25
24
26
Statistics. _mean (A:: AbstractGPUArray , :: Colon ) = sum (A) / length (A)
25
27
Statistics. _mean (f, A:: AbstractGPUArray , :: Colon ) = sum (f, A) / length (A)
26
- Statistics. _mean (A:: AbstractGPUArray , dims) = mean! (Base. reducedim_init (t -> t/ 2 , + , A, dims), A)
27
- Statistics. _mean (f, A:: AbstractGPUArray , dims) = sum (f, A, dims= dims) / mapreduce (i -> size (A, i), * , unique (dims); init= 1 )
28
+
29
+ function Statistics. _mean (A:: AbstractGPUArray , dims)
30
+ T = float (eltype (A))
31
+ λ = convert (T, inv (_mean_denom (A, dims)))
32
+ sum (Base. Fix1 (* ,λ), A; dims)
33
+ end
34
+ function Statistics. _mean (f, A:: AbstractGPUArray , dims)
35
+ T = float (eltype (A))
36
+ λ = convert (T, inv (_mean_denom (A, dims)))
37
+ sum (Base. Fix1 (* ,λ) ∘ f, A; dims)
38
+ end
28
39
29
40
function Statistics. covzm (x:: AbstractGPUMatrix , vardim:: Int = 1 ; corrected:: Bool = true )
30
41
C = Statistics. unscaled_covzm (x, vardim)
@@ -49,3 +60,7 @@ function Statistics.corzm(x::AbstractGPUMatrix, vardim::Int=1)
49
60
c = Statistics. unscaled_covzm (x, vardim)
50
61
return Statistics. cov2cor! (c, sqrt .(diag (c)))
51
62
end
63
+
64
+ _mean_denom (x:: AbstractArray , dims:: Integer ) = size (x, dims)
65
+ _mean_denom (x:: AbstractArray , dims:: Colon ) = length (x)
66
+ _mean_denom (x:: AbstractArray , dims) = prod (size (x,d) for d in unique (dims); init= 1 )
0 commit comments