@@ -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 ) =
@@ -49,3 +51,7 @@ function Statistics.corzm(x::AbstractGPUMatrix, vardim::Int=1)
49
51
c = Statistics. unscaled_covzm (x, vardim)
50
52
return Statistics. cov2cor! (c, sqrt .(diag (c)))
51
53
end
54
+
55
+ _mean_denom (x:: AbstractArray , dims:: Integer ) = size (x, dims)
56
+ _mean_denom (x:: AbstractArray , dims:: Colon ) = length (x)
57
+ _mean_denom (x:: AbstractArray , dims) = prod (size (x,d) for d in unique (dims); init= 1 )
0 commit comments