@@ -125,14 +125,20 @@ LinearAlgebra.sqrt(A::PDMat) = PDMat(sqrt(Hermitian(A.mat)))
125125function whiten! (r:: AbstractVecOrMat , a:: PDMat , x:: AbstractVecOrMat )
126126 @check_argdims axes (r) == axes (x)
127127 @check_argdims a. dim == size (x, 1 )
128- v = _rcopy! (r, x)
129- return ldiv! (chol_lower (cholesky (a)), v)
128+ if r === x
129+ return ldiv! (chol_lower (cholesky (a)), r)
130+ else
131+ return ldiv! (r, chol_lower (cholesky (a)), x)
132+ end
130133end
131134function unwhiten! (r:: AbstractVecOrMat , a:: PDMat , x:: AbstractVecOrMat )
132135 @check_argdims axes (r) == axes (x)
133136 @check_argdims a. dim == size (x, 1 )
134- v = _rcopy! (r, x)
135- return lmul! (chol_lower (cholesky (a)), v)
137+ if r === x
138+ return lmul! (chol_lower (cholesky (a)), r)
139+ else
140+ return mul! (r, chol_lower (cholesky (a)), x)
141+ end
136142end
137143
138144function whiten (a:: PDMat , x:: AbstractVecOrMat )
@@ -162,8 +168,7 @@ function quad!(r::AbstractArray, a::PDMat, x::AbstractMatrix)
162168 aU = chol_upper (cholesky (a))
163169 z = similar (r, a. dim) # buffer to save allocations
164170 @inbounds for i in axes (x, 2 )
165- copyto! (z, view (x, :, i))
166- lmul! (aU, z)
171+ mul! (z, aU, view (x, :, i))
167172 r[i] = sum (abs2, z)
168173 end
169174 return r
0 commit comments