From cf39e3b7c9ee4d5bf1e41acc96af577f440350ac Mon Sep 17 00:00:00 2001 From: Daniel Karrasch Date: Tue, 21 May 2019 10:21:53 -0600 Subject: [PATCH] bugfix for ldiv!(D::Diagonal, B::StridedVecOrMat) and tests --- stdlib/LinearAlgebra/src/diagonal.jl | 2 +- stdlib/LinearAlgebra/test/diagonal.jl | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/stdlib/LinearAlgebra/src/diagonal.jl b/stdlib/LinearAlgebra/src/diagonal.jl index 77c9b924cae43..23180477bb2c5 100644 --- a/stdlib/LinearAlgebra/src/diagonal.jl +++ b/stdlib/LinearAlgebra/src/diagonal.jl @@ -481,7 +481,7 @@ function ldiv!(D::Diagonal, B::StridedVecOrMat) if di == 0 throw(SingularException(i)) end - B[i,j] /= di + B[i,j] = di \ B[i,j] end end return B diff --git a/stdlib/LinearAlgebra/test/diagonal.jl b/stdlib/LinearAlgebra/test/diagonal.jl index 4dc697336d75a..8b92539ab1ad3 100644 --- a/stdlib/LinearAlgebra/test/diagonal.jl +++ b/stdlib/LinearAlgebra/test/diagonal.jl @@ -441,6 +441,15 @@ end @test det(D) == 4 end +@testset "linear solve for block diagonal matrices" begin + D = Diagonal([rand(2,2) for _ in 1:5]) + b = [rand(2,2) for _ in 1:5] + B = [rand(2,2) for _ in 1:5, _ in 1:5] + @test ldiv!(D, copy(b)) ≈ Diagonal(inv.(D.diag)) * b + @test ldiv!(D, copy(B)) ≈ Diagonal(inv.(D.diag)) * B + @test rdiv!(copy(B), D) ≈ B * Diagonal(inv.(D.diag)) +end + @testset "multiplication with Symmetric/Hermitian" begin for T in (Float64, ComplexF64) D = Diagonal(randn(T, n))