Skip to content

Commit b7fd696

Browse files
authored
specialize kron!(::Diagonal, ::Diagonal, ::Diagonal) (#1392)
1 parent db95a2a commit b7fd696

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

src/diagonal.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,11 @@ end
806806

807807
kron(A::Diagonal, B::Diagonal) = Diagonal(kron(A.diag, B.diag))
808808

809+
function kron!(C::Diagonal, A::Diagonal, B::Diagonal)
810+
kron!(C.diag, A.diag, B.diag)
811+
return C
812+
end
813+
809814
function kron(A::Diagonal, B::SymTridiagonal)
810815
kdv = kron(A.diag, B.dv)
811816
# We don't need to drop the last element

test/diagonal.jl

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1396,14 +1396,26 @@ end
13961396
end
13971397

13981398
@testset "kron! for Diagonal" begin
1399-
a = Diagonal([2,2])
1400-
b = Diagonal([1,1])
1401-
c = Diagonal([0,0,0,0])
1402-
kron!(c,b,a)
1403-
@test c == Diagonal([2,2,2,2])
1404-
c=Diagonal(Vector{Float64}(undef, 4))
1405-
kron!(c,a,b)
1406-
@test c == Diagonal([2,2,2,2])
1399+
a = Diagonal([1, 2])
1400+
b = Diagonal([3, 4])
1401+
# Diagonal out
1402+
c = Diagonal([0, 0, 0, 0])
1403+
kron!(c, b, a)
1404+
@test c == Diagonal([3, 6, 4, 8])
1405+
@test c == kron!(fill(0, 4, 4), Matrix(b), Matrix(a)) # against dense kron!
1406+
c = Diagonal(Vector{Float64}(undef, 4))
1407+
kron!(c, a, b)
1408+
@test c == Diagonal([3.0, 4.0, 6.0, 8.0])
1409+
1410+
# AbstractArray out
1411+
c = fill(0, 4, 4)
1412+
kron!(c, b, a)
1413+
@test c == diagm([3, 6, 4, 8])
1414+
@test c == kron!(fill(0, 4, 4), Matrix(b), Matrix(a)) # against dense kron!
1415+
c = Matrix{Float64}(undef, 4, 4)
1416+
kron!(c, a, b)
1417+
@test c == diagm([3.0, 4.0, 6.0, 8.0])
1418+
@test_throws DimensionMismatch kron!(Diagonal(zeros(5)), Diagonal(zeros(2)), Diagonal(zeros(2)))
14071419
end
14081420

14091421
@testset "uppertriangular/lowertriangular" begin

0 commit comments

Comments
 (0)