Skip to content

Commit 3d9316b

Browse files
committed
Clarify which are is modified in mul/div.
1 parent fb52730 commit 3d9316b

24 files changed

+461
-444
lines changed

base/deprecated.jl

Lines changed: 112 additions & 105 deletions
Large diffs are not rendered by default.

base/hashing2.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,4 +178,4 @@ function hash(s::Union{String,SubString{String}}, h::UInt)
178178
# note: use pointer(s) here (see #6058).
179179
ccall(memhash, UInt, (Ptr{UInt8}, Csize_t, UInt32), pointer(s), sizeof(s), h % UInt32) + h
180180
end
181-
hash(s::AbstractString, h::UInt) = hash(String(s), h)
181+
hash(s::AbstractString, h::UInt) = hash(String(s), h)

base/linalg/diagonal.jl

Lines changed: 36 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -150,109 +150,99 @@ end
150150
(*)(Da::Diagonal, Db::Diagonal) = Diagonal(Da.diag .* Db.diag)
151151
(*)(D::Diagonal, V::AbstractVector) = D.diag .* V
152152

153-
(*)(A::AbstractTriangular, D::Diagonal) = mul!(copy(A), D)
154-
(*)(D::Diagonal, B::AbstractTriangular) = mul!(D, copy(B))
153+
(*)(A::AbstractTriangular, D::Diagonal) = mul1!(copy(A), D)
154+
(*)(D::Diagonal, B::AbstractTriangular) = mul2!(D, copy(B))
155155

156156
(*)(A::AbstractMatrix, D::Diagonal) =
157157
scale!(similar(A, promote_op(*, eltype(A), eltype(D.diag)), size(A)), A, D.diag)
158158
(*)(D::Diagonal, A::AbstractMatrix) =
159159
scale!(similar(A, promote_op(*, eltype(A), eltype(D.diag)), size(A)), D.diag, A)
160160

161-
mul!(A::Union{LowerTriangular,UpperTriangular}, D::Diagonal) = typeof(A)(mul!(A.data, D))
162-
function mul!(A::UnitLowerTriangular, D::Diagonal)
163-
mul!(A.data, D)
161+
162+
mul1!(A::Union{LowerTriangular,UpperTriangular}, D::Diagonal) = typeof(A)(mul1!(A.data, D))
163+
function mul1!(A::UnitLowerTriangular, D::Diagonal)
164+
mul1!(A.data, D)
164165
for i = 1:size(A, 1)
165166
A.data[i,i] = D.diag[i]
166167
end
167168
LowerTriangular(A.data)
168169
end
169-
function mul!(A::UnitUpperTriangular, D::Diagonal)
170-
mul!(A.data, D)
170+
function mul1!(A::UnitUpperTriangular, D::Diagonal)
171+
mul1!(A.data, D)
171172
for i = 1:size(A, 1)
172173
A.data[i,i] = D.diag[i]
173174
end
174175
UpperTriangular(A.data)
175176
end
176-
function mul!(D::Diagonal, B::UnitLowerTriangular)
177-
mul!(D, B.data)
177+
178+
function mul2!(D::Diagonal, B::UnitLowerTriangular)
179+
mul2!(D, B.data)
178180
for i = 1:size(B, 1)
179181
B.data[i,i] = D.diag[i]
180182
end
181183
LowerTriangular(B.data)
182184
end
183-
function mul!(D::Diagonal, B::UnitUpperTriangular)
184-
mul!(D, B.data)
185+
function mul2!(D::Diagonal, B::UnitUpperTriangular)
186+
mul2!(D, B.data)
185187
for i = 1:size(B, 1)
186188
B.data[i,i] = D.diag[i]
187189
end
188190
UpperTriangular(B.data)
189191
end
190192

193+
191194
*(adjD::Adjoint{<:Any,<:Diagonal}, B::Diagonal) = (D = adjD.parent; Diagonal(adjoint.(D.diag) .* B.diag))
192-
*(adjA::Adjoint{<:Any,<:AbstractTriangular}, D::Diagonal) = (A = adjA.parent; mul!(adjoint(A), D))
195+
*(adjA::Adjoint{<:Any,<:AbstractTriangular}, D::Diagonal) = (A = adjA.parent; mul1!(adjoint(A), D))
196+
193197
function *(adjA::Adjoint{<:Any,<:AbstractMatrix}, D::Diagonal)
194198
A = adjA.parent
195199
Ac = similar(A, promote_op(*, eltype(A), eltype(D.diag)), (size(A, 2), size(A, 1)))
196200
adjoint!(Ac, A)
197-
mul!(Ac, D)
201+
mul1!(Ac, D)
198202
end
199203

200204
*(transD::Transpose{<:Any,<:Diagonal}, B::Diagonal) = (D = transD.parent; Diagonal(transpose.(D.diag) .* B.diag))
201-
*(transA::Transpose{<:Any,<:AbstractTriangular}, D::Diagonal) = (A = transA.parent; mul!(transpose(A), D))
205+
*(transA::Transpose{<:Any,<:AbstractTriangular}, D::Diagonal) = (A = transA.parent; mul1!(transpose(A), D))
202206
function *(transA::Transpose{<:Any,<:AbstractMatrix}, D::Diagonal)
203207
A = transA.parent
204208
At = similar(A, promote_op(*, eltype(A), eltype(D.diag)), (size(A, 2), size(A, 1)))
205209
transpose!(At, A)
206-
mul!(At, D)
210+
mul1!(At, D)
207211
end
208212

209213
*(D::Diagonal, adjB::Adjoint{<:Any,<:Diagonal}) = (B = adjB.parent; Diagonal(D.diag .* adjoint.(B.diag)))
210-
*(D::Diagonal, adjB::Adjoint{<:Any,<:AbstractTriangular}) = (B = adjB.parent; mul!(D, adjoint(B)))
211-
*(D::Diagonal, adjQ::Adjoint{<:Any,<:Union{QRCompactWYQ,QRPackedQ}}) = (Q = adjQ.parent; mul!(Array(D), Adjoint(Q)))
214+
*(D::Diagonal, adjB::Adjoint{<:Any,<:AbstractTriangular}) = (B = adjB.parent; mul2!(D, adjoint(B)))
215+
*(D::Diagonal, adjQ::Adjoint{<:Any,<:Union{QRCompactWYQ,QRPackedQ}}) = (Q = adjQ.parent; mul1!(Array(D), Adjoint(Q)))
212216
function *(D::Diagonal, adjA::Adjoint{<:Any,<:AbstractMatrix})
213217
A = adjA.parent
214218
Ac = similar(A, promote_op(*, eltype(A), eltype(D.diag)), (size(A, 2), size(A, 1)))
215219
adjoint!(Ac, A)
216-
mul!(D, Ac)
220+
mul2!(D, Ac)
217221
end
218222

219223
*(D::Diagonal, transB::Transpose{<:Any,<:Diagonal}) = (B = transB.parent; Diagonal(D.diag .* transpose.(B.diag)))
220-
*(D::Diagonal, transB::Transpose{<:Any,<:AbstractTriangular}) = (B = transB.parent; mul!(D, transpose(B)))
224+
*(D::Diagonal, transB::Transpose{<:Any,<:AbstractTriangular}) = (B = transB.parent; mul2!(D, transpose(B)))
221225
function *(D::Diagonal, transA::Transpose{<:Any,<:AbstractMatrix})
222226
A = transA.parent
223227
At = similar(A, promote_op(*, eltype(A), eltype(D.diag)), (size(A, 2), size(A, 1)))
224228
transpose!(At, A)
225-
mul!(D, At)
229+
mul2!(D, At)
226230
end
227231

228232
*(adjD::Adjoint{<:Any,<:Diagonal}, adjB::Adjoint{<:Any,<:Diagonal}) =
229233
(D = adjD.parent; B = adjB.parent; Diagonal(adjoint.(D.diag) .* adjoint.(B.diag)))
230234
*(transD::Transpose{<:Any,<:Diagonal}, transB::Transpose{<:Any,<:Diagonal}) =
231235
(D = transD.parent; B = transB.parent; Diagonal(transpose.(D.diag) .* transpose.(B.diag)))
232236

233-
mul!(A::Diagonal, B::Diagonal) = throw(MethodError(mul!, Tuple{Diagonal,Diagonal}))
234-
mul!(A::QRPackedQ, D::Diagonal) = throw(MethodError(mul!, Tuple{Diagonal,Diagonal}))
235-
mul!(A::QRPackedQ, B::Adjoint{<:Any,<:Diagonal}) = throw(MethodError(mul!, (A, B)))
236-
mul!(A::QRPackedQ, B::Transpose{<:Any,<:Diagonal}) = throw(MethodError(mul!, (A, B)))
237-
mul!(A::Adjoint{<:Any,<:QRPackedQ}, B::Diagonal) = throw(MethodError(mul!, (A, B)))
238-
mul!(A::Adjoint{<:Any,<:QRPackedQ}, B::Adjoint{<:Any,<:Diagonal}) = throw(MethodError(mul!, (A, B)))
239-
mul!(A::Adjoint{<:Any,<:QRPackedQ}, B::Transpose{<:Any,<:Diagonal}) = throw(MethodError(mul!, (A, B)))
240-
mul!(A::Diagonal, B::Adjoint{<:Any,<:Diagonal}) = throw(MethodError(mul!, (A, B)))
241-
mul!(A::Diagonal, B::Transpose{<:Any,<:Diagonal}) = throw(MethodError(mul!, (A, B)))
242-
mul!(A::Adjoint{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:Diagonal}) = throw(MethodError(mul!, (A, B)))
243-
mul!(A::Adjoint{<:Any,<:Diagonal}, B::Transpose{<:Any,<:Diagonal}) = throw(MethodError(mul!, (A, B)))
244-
mul!(A::Transpose{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:Diagonal}) = throw(MethodError(mul!, (A, B)))
245-
mul!(A::Transpose{<:Any,<:Diagonal}, B::Transpose{<:Any,<:Diagonal}) = throw(MethodError(mul!, (A, B)))
246-
mul!(transA::Transpose{<:Any,<:Diagonal}, B::Diagonal) =
247-
throw(MethodError(mul!, Tuple{Transpose{<:Any,<:Diagonal},Diagonal}))
248-
mul!(adjA::Adjoint{<:Any,<:Diagonal}, B::Diagonal) =
249-
throw(MethodError(mul!, Tuple{Adjoint{<:Any,<:Diagonal},Diagonal}))
250-
mul!(A::Diagonal, B::AbstractMatrix) = scale!(A.diag, B)
251-
mul!(adjA::Adjoint{<:Any,<:Diagonal}, B::AbstractMatrix) = (A = adjA.parent; scale!(conj(A.diag),B))
252-
mul!(transA::Transpose{<:Any,<:Diagonal}, B::AbstractMatrix) = (A = transA.parent; scale!(A.diag,B))
253-
mul!(A::AbstractMatrix, B::Diagonal) = scale!(A,B.diag)
254-
mul!(A::AbstractMatrix, adjB::Adjoint{<:Any,<:Diagonal}) = (B = adjB.parent; scale!(A,conj(B.diag)))
255-
mul!(A::AbstractMatrix, transB::Transpose{<:Any,<:Diagonal}) = (B = transB.parent; scale!(A,B.diag))
237+
mul1!(A::Diagonal,B::Diagonal) = Diagonal(A.diag .*= B.diag)
238+
mul2!(A::Diagonal,B::Diagonal) = Diagonal(B.diag .= A.diag .* B.diag)
239+
240+
mul2!(A::Diagonal, B::AbstractMatrix) = scale!(A.diag, B)
241+
mul2!(adjA::Adjoint{<:Any,<:Diagonal}, B::AbstractMatrix) = (A = adjA.parent; scale!(conj(A.diag),B))
242+
mul2!(transA::Transpose{<:Any,<:Diagonal}, B::AbstractMatrix) = (A = transA.parent; scale!(A.diag,B))
243+
mul1!(A::AbstractMatrix, B::Diagonal) = scale!(A,B.diag)
244+
mul1!(A::AbstractMatrix, adjB::Adjoint{<:Any,<:Diagonal}) = (B = adjB.parent; scale!(A,conj(B.diag)))
245+
mul1!(A::AbstractMatrix, transB::Transpose{<:Any,<:Diagonal}) = (B = transB.parent; scale!(A,B.diag))
256246

257247
# Get ambiguous method if try to unify AbstractVector/AbstractMatrix here using AbstractVecOrMat
258248
mul!(out::AbstractVector, A::Diagonal, in::AbstractVector) = out .= A.diag .* in
@@ -296,6 +286,7 @@ mul!(C::AbstractMatrix, transA::Transpose{<:Any,<:Diagonal}, transB::Transpose{<
296286

297287

298288
(/)(Da::Diagonal, Db::Diagonal) = Diagonal(Da.diag ./ Db.diag)
289+
299290
function ldiv!(D::Diagonal{T}, v::AbstractVector{T}) where {T}
300291
if length(v) != length(D.diag)
301292
throw(DimensionMismatch("diagonal matrix is $(length(D.diag)) by $(length(D.diag)) but right hand side has $(length(v)) rows"))
@@ -325,6 +316,7 @@ function ldiv!(D::Diagonal{T}, V::AbstractMatrix{T}) where {T}
325316
V
326317
end
327318

319+
328320
ldiv!(adjD::Adjoint{<:Any,<:Diagonal{T}}, B::AbstractVecOrMat{T}) where {T} =
329321
(D = adjD.parent; ldiv!(conj(D), B))
330322
ldiv!(transD::Transpose{<:Any,<:Diagonal{T}}, B::AbstractVecOrMat{T}) where {T} =
@@ -348,6 +340,7 @@ function rdiv!(A::AbstractMatrix{T}, D::Diagonal{T}) where {T}
348340
A
349341
end
350342

343+
351344
rdiv!(A::AbstractMatrix{T}, adjD::Adjoint{<:Any,<:Diagonal{T}}) where {T} =
352345
(D = adjD.parent; rdiv!(A, conj(D)))
353346
rdiv!(A::AbstractMatrix{T}, transD::Transpose{<:Any,<:Diagonal{T}}) where {T} =

base/linalg/givens.jl

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ transpose(R::AbstractRotation) = error("transpose not implemented for $(typeof(R
77

88
function *(R::AbstractRotation{T}, A::AbstractVecOrMat{S}) where {T,S}
99
TS = typeof(zero(T)*zero(S) + zero(T)*zero(S))
10-
mul!(convert(AbstractRotation{TS}, R), TS == S ? copy(A) : convert(AbstractArray{TS}, A))
10+
mul2!(convert(AbstractRotation{TS}, R), TS == S ? copy(A) : convert(AbstractArray{TS}, A))
1111
end
1212
*(A::AbstractVector, adjR::Adjoint{<:Any,<:AbstractRotation}) = _absvecormat_mul_adjrot(A, adjR)
1313
*(A::AbstractMatrix, adjR::Adjoint{<:Any,<:AbstractRotation}) = _absvecormat_mul_adjrot(A, adjR)
1414
function _absvecormat_mul_adjrot(A::AbstractVecOrMat{T}, adjR::Adjoint{<:Any,<:AbstractRotation{S}}) where {T,S}
1515
R = adjR.parent
1616
TS = typeof(zero(T)*zero(S) + zero(T)*zero(S))
17-
mul!(TS == T ? copy(A) : convert(AbstractArray{TS}, A), Adjoint(convert(AbstractRotation{TS}, R)))
17+
mul1!(TS == T ? copy(A) : convert(AbstractArray{TS}, A), Adjoint(convert(AbstractRotation{TS}, R)))
1818
end
1919
"""
2020
LinAlg.Givens(i1,i2,c,s) -> G
@@ -323,10 +323,7 @@ function getindex(G::Givens, i::Integer, j::Integer)
323323
end
324324
end
325325

326-
327-
mul!(G1::Givens, G2::Givens) = error("Operation not supported. Consider *")
328-
329-
function mul!(G::Givens, A::AbstractVecOrMat)
326+
function mul2!(G::Givens, A::AbstractVecOrMat)
330327
m, n = size(A, 1), size(A, 2)
331328
if G.i2 > m
332329
throw(DimensionMismatch("column indices for rotation are outside the matrix"))
@@ -338,7 +335,7 @@ function mul!(G::Givens, A::AbstractVecOrMat)
338335
end
339336
return A
340337
end
341-
function mul!(A::AbstractMatrix, adjG::Adjoint{<:Any,<:Givens})
338+
function mul1!(A::AbstractMatrix, adjG::Adjoint{<:Any,<:Givens})
342339
G = adjG.parent
343340
m, n = size(A, 1), size(A, 2)
344341
if G.i2 > n
@@ -351,20 +348,21 @@ function mul!(A::AbstractMatrix, adjG::Adjoint{<:Any,<:Givens})
351348
end
352349
return A
353350
end
354-
function mul!(G::Givens, R::Rotation)
351+
352+
function mul2!(G::Givens, R::Rotation)
355353
push!(R.rotations, G)
356354
return R
357355
end
358-
function mul!(R::Rotation, A::AbstractMatrix)
356+
function mul2!(R::Rotation, A::AbstractMatrix)
359357
@inbounds for i = 1:length(R.rotations)
360-
mul!(R.rotations[i], A)
358+
mul2!(R.rotations[i], A)
361359
end
362360
return A
363361
end
364-
function mul!(A::AbstractMatrix, adjR::Adjoint{<:Any,<:Rotation})
362+
function mul1!(A::AbstractMatrix, adjR::Adjoint{<:Any,<:Rotation})
365363
R = adjR.parent
366364
@inbounds for i = 1:length(R.rotations)
367-
mul!(A, Adjoint(R.rotations[i]))
365+
mul1!(A, Adjoint(R.rotations[i]))
368366
end
369367
return A
370368
end
@@ -383,14 +381,3 @@ end
383381
# dismabiguation methods: *(Diag/RowVec/AbsTri, Adj of AbstractRotation)
384382
*(A::Diagonal, B::Adjoint{<:Any,<:AbstractRotation}) = A * adjoint(B.parent)
385383
*(A::AbstractTriangular, B::Adjoint{<:Any,<:AbstractRotation}) = A * adjoint(B.parent)
386-
# moar disambiguation
387-
mul!(A::QRPackedQ, B::Adjoint{<:Any,<:Givens}) = throw(MethodError(mul!, (A, B)))
388-
mul!(A::QRPackedQ, B::Adjoint{<:Any,<:Rotation}) = throw(MethodError(mul!, (A, B)))
389-
mul!(A::Adjoint{<:Any,<:QRPackedQ}, B::Adjoint{<:Any,<:Givens}) = throw(MethodError(mul!, (A, B)))
390-
mul!(A::Adjoint{<:Any,<:QRPackedQ}, B::Adjoint{<:Any,<:Rotation}) = throw(MethodError(mul!, (A, B)))
391-
mul!(A::Diagonal, B::Adjoint{<:Any,<:Givens}) = throw(MethodError(mul!, (A, B)))
392-
mul!(A::Diagonal, B::Adjoint{<:Any,<:Rotation}) = throw(MethodError(mul!, (A, B)))
393-
mul!(A::Adjoint{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:Givens}) = throw(MethodError(mul!, (A, B)))
394-
mul!(A::Adjoint{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:Rotation}) = throw(MethodError(mul!, (A, B)))
395-
mul!(A::Transpose{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:Rotation}) = throw(MethodError(mul!, (A, B)))
396-
mul!(A::Transpose{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:Givens}) = throw(MethodError(mul!, (A, B)))

base/linalg/hessenberg.jl

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ function getindex(A::HessenbergQ, i::Integer, j::Integer)
7171
x[i] = 1
7272
y = zeros(eltype(A), size(A, 2))
7373
y[j] = 1
74-
return dot(x, mul!(A, y))
74+
return dot(x, mul2!(A, y))
7575
end
7676

7777
## reconstruct the original matrix
@@ -82,31 +82,31 @@ AbstractArray(F::Hessenberg) = AbstractMatrix(F)
8282
Matrix(F::Hessenberg) = Array(AbstractArray(F))
8383
Array(F::Hessenberg) = Matrix(F)
8484

85-
mul!(Q::HessenbergQ{T}, X::StridedVecOrMat{T}) where {T<:BlasFloat} =
85+
mul2!(Q::HessenbergQ{T}, X::StridedVecOrMat{T}) where {T<:BlasFloat} =
8686
LAPACK.ormhr!('L', 'N', 1, size(Q.factors, 1), Q.factors, Q.τ, X)
87-
mul!(X::StridedMatrix{T}, Q::HessenbergQ{T}) where {T<:BlasFloat} =
87+
mul1!(X::StridedMatrix{T}, Q::HessenbergQ{T}) where {T<:BlasFloat} =
8888
LAPACK.ormhr!('R', 'N', 1, size(Q.factors, 1), Q.factors, Q.τ, X)
89-
mul!(adjQ::Adjoint{<:Any,<:HessenbergQ{T}}, X::StridedVecOrMat{T}) where {T<:BlasFloat} =
89+
mul2!(adjQ::Adjoint{<:Any,<:HessenbergQ{T}}, X::StridedVecOrMat{T}) where {T<:BlasFloat} =
9090
(Q = adjQ.parent; LAPACK.ormhr!('L', ifelse(T<:Real, 'T', 'C'), 1, size(Q.factors, 1), Q.factors, Q.τ, X))
91-
mul!(X::StridedMatrix{T}, adjQ::Adjoint{<:Any,<:HessenbergQ{T}}) where {T<:BlasFloat} =
91+
mul1!(X::StridedMatrix{T}, adjQ::Adjoint{<:Any,<:HessenbergQ{T}}) where {T<:BlasFloat} =
9292
(Q = adjQ.parent; LAPACK.ormhr!('R', ifelse(T<:Real, 'T', 'C'), 1, size(Q.factors, 1), Q.factors, Q.τ, X))
9393

94-
9594
function (*)(Q::HessenbergQ{T}, X::StridedVecOrMat{S}) where {T,S}
9695
TT = typeof(zero(T)*zero(S) + zero(T)*zero(S))
97-
return mul!(Q, copy_oftype(X, TT))
96+
97+
return mul2!(Q, copy_oftype(X, TT))
9898
end
9999
function (*)(X::StridedVecOrMat{S}, Q::HessenbergQ{T}) where {T,S}
100100
TT = typeof(zero(T)*zero(S) + zero(T)*zero(S))
101-
return mul!(copy_oftype(X, TT), Q)
101+
return mul1!(copy_oftype(X, TT), Q)
102102
end
103103
function *(adjQ::Adjoint{<:Any,<:HessenbergQ{T}}, X::StridedVecOrMat{S}) where {T,S}
104104
Q = adjQ.parent
105105
TT = typeof(zero(T)*zero(S) + zero(T)*zero(S))
106-
return mul!(Adjoint(Q), copy_oftype(X, TT))
106+
return mul2!(Adjoint(Q), copy_oftype(X, TT))
107107
end
108108
function *(X::StridedVecOrMat{S}, adjQ::Adjoint{<:Any,<:HessenbergQ{T}}) where {T,S}
109109
Q = adjQ.parent
110110
TT = typeof(zero(T)*zero(S) + zero(T)*zero(S))
111-
return mul!(copy_oftype(X, TT), Adjoint(Q))
111+
return mul1!(copy_oftype(X, TT), Adjoint(Q))
112112
end

base/linalg/linalg.jl

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -238,11 +238,9 @@ function char_uplo(uplo::Symbol)
238238
end
239239

240240
"""
241-
ldiv!([Y,] A, B) -> Y
241+
ldiv!(Y, A, B) -> Y
242242
243243
Compute `A \\ B` in-place and store the result in `Y`, returning the result.
244-
If only two arguments are passed, then `ldiv!(A, B)` overwrites `B` with
245-
the result.
246244
247245
The argument `A` should *not* be a matrix. Rather, instead of matrices it should be a
248246
factorization object (e.g. produced by [`factorize`](@ref) or [`cholfact`](@ref)).
@@ -254,11 +252,24 @@ control over the factorization of `A`.
254252
ldiv!(Y, A, B)
255253

256254
"""
257-
rdiv!([Y,] A, B) -> Y
255+
ldiv!(A, B)
258256
259-
Compute `A / B` in-place and store the result in `Y`, returning the result.
260-
If only two arguments are passed, then `rdiv!(A, B)` overwrites `A` with
261-
the result.
257+
Compute `A \\ B` in-place and overwriting `B` to store the result.
258+
259+
The argument `A` should *not* be a matrix. Rather, instead of matrices it should be a
260+
factorization object (e.g. produced by [`factorize`](@ref) or [`cholfact`](@ref)).
261+
The reason for this is that factorization itself is both expensive and typically allocates memory
262+
(although it can also be done in-place via, e.g., [`lufact!`](@ref)),
263+
and performance-critical situations requiring `ldiv!` usually also require fine-grained
264+
control over the factorization of `A`.
265+
"""
266+
ldiv!(A, B)
267+
268+
269+
"""
270+
rdiv!(A, B)
271+
272+
Compute `A / B` in-place and overwriting `A` to store the result.
262273
263274
The argument `B` should *not* be a matrix. Rather, instead of matrices it should be a
264275
factorization object (e.g. produced by [`factorize`](@ref) or [`cholfact`](@ref)).
@@ -267,7 +278,7 @@ The reason for this is that factorization itself is both expensive and typically
267278
and performance-critical situations requiring `rdiv!` usually also require fine-grained
268279
control over the factorization of `B`.
269280
"""
270-
rdiv!(Y, A, B)
281+
rdiv!(A, B)
271282

272283
copy_oftype(A::AbstractArray{T}, ::Type{T}) where {T} = copy(A)
273284
copy_oftype(A::AbstractArray{T,N}, ::Type{S}) where {T,N,S} = convert(AbstractArray{S,N}, A)

0 commit comments

Comments
 (0)