@@ -731,10 +731,50 @@ function _pairwise!(r::AbstractMatrix, dist::Union{WeightedSqEuclidean,WeightedE
731
731
r
732
732
end
733
733
734
+ # MeanSqDeviation, RMSDeviation, NormRMSDeviation
735
+ function _pairwise! (r:: AbstractMatrix , dist:: MeanSqDeviation , a:: AbstractMatrix , b:: AbstractMatrix )
736
+ _pairwise! (r, SqEuclidean (), a, b)
737
+ # TODO : Replace by rdiv!(r, size(a, 1)) once julia compat ≥v1.2
738
+ s = size (a, 1 )
739
+ @simd for I in eachindex (r)
740
+ @inbounds r[I] /= s
741
+ end
742
+ return r
743
+ end
744
+ _pairwise! (r:: AbstractMatrix , dist:: RMSDeviation , a:: AbstractMatrix , b:: AbstractMatrix ) =
745
+ sqrt! (_pairwise! (r, MeanSqDeviation (), a, b))
746
+ function _pairwise! (r:: AbstractMatrix , dist:: NormRMSDeviation , a:: AbstractMatrix , b:: AbstractMatrix )
747
+ _pairwise! (r, RMSDeviation (), a, b)
748
+ @views for (i, j) in zip (axes (r, 1 ), axes (a, 2 ))
749
+ amin, amax = extrema (a[:,j])
750
+ r[i,:] ./= amax - amin
751
+ end
752
+ return r
753
+ end
754
+
755
+ function _pairwise! (r:: AbstractMatrix , dist:: MeanSqDeviation , a:: AbstractMatrix )
756
+ _pairwise! (r, SqEuclidean (), a)
757
+ # TODO : Replace by rdiv!(r, size(a, 1)) once julia compat ≥v1.2
758
+ s = size (a, 1 )
759
+ @simd for I in eachindex (r)
760
+ @inbounds r[I] /= s
761
+ end
762
+ return r
763
+ end
764
+ _pairwise! (r:: AbstractMatrix , dist:: RMSDeviation , a:: AbstractMatrix ) =
765
+ sqrt! (_pairwise! (r, MeanSqDeviation (), a))
766
+ function _pairwise! (r:: AbstractMatrix , dist:: NormRMSDeviation , a:: AbstractMatrix )
767
+ _pairwise! (r, RMSDeviation (), a)
768
+ @views for (i, j) in zip (axes (r, 1 ), axes (a, 2 ))
769
+ amin, amax = extrema (a[:,j])
770
+ r[i,:] ./= amax - amin
771
+ end
772
+ return r
773
+ end
774
+
734
775
# CosineDist
735
776
736
- function _pairwise! (r:: AbstractMatrix , :: CosineDist ,
737
- a:: AbstractMatrix , b:: AbstractMatrix )
777
+ function _pairwise! (r:: AbstractMatrix , :: CosineDist , a:: AbstractMatrix , b:: AbstractMatrix )
738
778
require_one_based_indexing (r, a, b)
739
779
m, na, nb = get_pairwise_dims (r, a, b)
740
780
inplace = promote_type (eltype (r), typeof (oneunit (eltype (a))' oneunit (eltype (b)))) === eltype (r)
772
812
# 2. pre-calculated `_centralize_colwise` avoids four times of redundant computations
773
813
# of `_centralize` -- ~4x speed up
774
814
_centralize_colwise (x:: AbstractMatrix ) = x .- mean (x, dims= 1 )
775
- function _pairwise! (r:: AbstractMatrix , :: CorrDist ,
776
- a:: AbstractMatrix , b:: AbstractMatrix )
815
+ _pairwise! (r:: AbstractMatrix , :: CorrDist , a:: AbstractMatrix , b:: AbstractMatrix ) =
777
816
_pairwise! (r, CosineDist (), _centralize_colwise (a), _centralize_colwise (b))
778
- end
779
- function _pairwise! (r:: AbstractMatrix , :: CorrDist , a:: AbstractMatrix )
817
+ _pairwise! (r:: AbstractMatrix , :: CorrDist , a:: AbstractMatrix ) =
780
818
_pairwise! (r, CosineDist (), _centralize_colwise (a))
781
- end
0 commit comments