@@ -125,14 +125,20 @@ LinearAlgebra.sqrt(A::PDMat) = PDMat(sqrt(Hermitian(A.mat)))
125
125
function whiten! (r:: AbstractVecOrMat , a:: PDMat , x:: AbstractVecOrMat )
126
126
@check_argdims axes (r) == axes (x)
127
127
@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
130
133
end
131
134
function unwhiten! (r:: AbstractVecOrMat , a:: PDMat , x:: AbstractVecOrMat )
132
135
@check_argdims axes (r) == axes (x)
133
136
@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
136
142
end
137
143
138
144
function whiten (a:: PDMat , x:: AbstractVecOrMat )
@@ -162,8 +168,7 @@ function quad!(r::AbstractArray, a::PDMat, x::AbstractMatrix)
162
168
aU = chol_upper (cholesky (a))
163
169
z = similar (r, a. dim) # buffer to save allocations
164
170
@inbounds for i in axes (x, 2 )
165
- copyto! (z, view (x, :, i))
166
- lmul! (aU, z)
171
+ mul! (z, aU, view (x, :, i))
167
172
r[i] = sum (abs2, z)
168
173
end
169
174
return r
0 commit comments