|
294 | 294 | (*)(D::Diagonal, A::HermOrSym) =
|
295 | 295 | mul!(similar(A, promote_op(*, eltype(A), eltype(D.diag)), size(A)), D, A)
|
296 | 296 |
|
297 |
| -rmul!(A::AbstractMatrix, D::Diagonal) = @inline mul!(A, A, D) |
298 |
| -lmul!(D::Diagonal, B::AbstractVecOrMat) = @inline mul!(B, D, B) |
| 297 | +function rmul!(A::AbstractMatrix, D::Diagonal) |
| 298 | + _muldiag_size_check(A, D) |
| 299 | + for I in CartesianIndices(A) |
| 300 | + row, col = Tuple(I) |
| 301 | + @inbounds A[row, col] *= D.diag[col] |
| 302 | + end |
| 303 | + return A |
| 304 | +end |
| 305 | +# T .= T * D |
| 306 | +function rmul!(T::Tridiagonal, D::Diagonal) |
| 307 | + _muldiag_size_check(T, D) |
| 308 | + (; dl, d, du) = T |
| 309 | + d[1] *= D.diag[1] |
| 310 | + for i in axes(dl,1) |
| 311 | + dl[i] *= D.diag[i] |
| 312 | + du[i] *= D.diag[i+1] |
| 313 | + d[i+1] *= D.diag[i+1] |
| 314 | + end |
| 315 | + return T |
| 316 | +end |
| 317 | + |
| 318 | +function lmul!(D::Diagonal, B::AbstractVecOrMat) |
| 319 | + _muldiag_size_check(D, B) |
| 320 | + for I in CartesianIndices(B) |
| 321 | + row = I[1] |
| 322 | + @inbounds B[I] = D.diag[row] * B[I] |
| 323 | + end |
| 324 | + return B |
| 325 | +end |
| 326 | + |
| 327 | +# in-place multiplication with a diagonal |
| 328 | +# T .= D * T |
| 329 | +function lmul!(D::Diagonal, T::Tridiagonal) |
| 330 | + _muldiag_size_check(D, T) |
| 331 | + (; dl, d, du) = T |
| 332 | + d[1] = D.diag[1] * d[1] |
| 333 | + for i in axes(dl,1) |
| 334 | + dl[i] = D.diag[i+1] * dl[i] |
| 335 | + du[i] = D.diag[i] * du[i] |
| 336 | + d[i+1] = D.diag[i+1] * d[i+1] |
| 337 | + end |
| 338 | + return T |
| 339 | +end |
299 | 340 |
|
300 | 341 | function (*)(A::AdjOrTransAbsMat, D::Diagonal)
|
301 | 342 | Ac = copy_similar(A, promote_op(*, eltype(A), eltype(D.diag)))
|
|
0 commit comments