Skip to content

Commit dbefc57

Browse files
committed
Forward Diagonal rmul!/lmul! for adj/trans to parent
1 parent f781708 commit dbefc57

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

src/diagonal.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,13 @@ function rmul!(A::AbstractMatrix, D::Diagonal)
360360
end
361361
return A
362362
end
363+
# A' = A' * D => A = D' * A
364+
# This uses the fact that D' is a Diagonal
365+
function rmul!(A::AdjOrTransAbsMat, D::Diagonal)
366+
f = wrapperop(A)
367+
lmul!(f(D), f(A))
368+
A
369+
end
363370
# T .= T * D
364371
function rmul!(T::Tridiagonal, D::Diagonal)
365372
matmul_size_check(size(T), size(D))
@@ -395,6 +402,13 @@ function lmul!(D::Diagonal, T::Tridiagonal)
395402
end
396403
return T
397404
end
405+
# A' = D * A' => A = A * D'
406+
# This uses the fact that D' is a Diagonal
407+
function lmul!(D::Diagonal, A::AdjOrTransAbsMat)
408+
f = wrapperop(A)
409+
rmul!(f(A), f(D))
410+
A
411+
end
398412

399413
@inline function __muldiag_nonzeroalpha!(out, D::Diagonal, B, alpha::Number, beta::Number)
400414
@inbounds for j in axes(B, 2)

test/diagonal.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,6 +1257,20 @@ end
12571257
end
12581258
end
12591259

1260+
@testset "rmul!/lmul! for adj/trans" begin
1261+
A = rand(5,4); B = similar(A)
1262+
for f in (adjoint, transpose)
1263+
D = Diagonal(rand(size(A,1)))
1264+
B .= A
1265+
rmul!(f(B), D)
1266+
@test f(B) == f(A) * D
1267+
D = Diagonal(rand(size(A,2)))
1268+
B .= A
1269+
lmul!(D, f(B))
1270+
@test f(B) == D * f(A)
1271+
end
1272+
end
1273+
12601274
struct SMatrix1{T} <: AbstractArray{T,2}
12611275
elt::T
12621276
end

0 commit comments

Comments
 (0)