From 447307a552178b84097903cde139fee00fe3af82 Mon Sep 17 00:00:00 2001 From: Fredrik Ekre Date: Mon, 18 Dec 2017 13:32:33 +0100 Subject: [PATCH] fill[stored]! for Symmetric and Hermitian matrices --- base/linalg/symmetric.jl | 15 +++++++++++++++ test/linalg/symmetric.jl | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/base/linalg/symmetric.jl b/base/linalg/symmetric.jl index 52bf40e0f934a..344e26b87acb1 100644 --- a/base/linalg/symmetric.jl +++ b/base/linalg/symmetric.jl @@ -201,6 +201,21 @@ function copyto!(dest::Hermitian, src::Hermitian) return dest end +# fill[stored]! +fill!(A::HermOrSym, x) = fillstored!(A, x) +function fillstored!(A::HermOrSym{T}, x) where T + xT = convert(T, x) + if isa(A, Hermitian) + isreal(xT) || throw(ArgumentError("cannot fill Hermitian matrix with a nonreal value")) + end + if A.uplo == 'U' + fillband!(A.data, xT, 0, size(A,2)-1) + else # A.uplo == 'L' + fillband!(A.data, xT, 1-size(A,1), 0) + end + return A +end + function Base.isreal(A::HermOrSym) n = size(A, 1) @inbounds if A.uplo == 'U' diff --git a/test/linalg/symmetric.jl b/test/linalg/symmetric.jl index afc74d9b73baf..cac85a6c26e24 100644 --- a/test/linalg/symmetric.jl +++ b/test/linalg/symmetric.jl @@ -469,3 +469,18 @@ end @test_throws TypeError Symmetric{Float64,Matrix{Float32}}(A, 'U') @test_throws TypeError Hermitian{Float64,Matrix{Float32}}(A, 'U') end + +@testset "fill[stored]!" begin + for uplo in (:U, :L) + # Hermitian + A = Hermitian(fill(1.0+0im, 2, 2), uplo) + @test fill!(A, 2) == fill(2, 2, 2) + @test A.data == (uplo == :U ? [2 2; 1.0+0im 2] : [2 1.0+0im; 2 2]) + @test_throws ArgumentError LinAlg.fill!(A, 2+im) + + # Symmetric + A = Symmetric(fill(1.0+im, 2, 2), uplo) + @test fill!(A, 2) == fill(2, 2, 2) + @test A.data == (uplo == :U ? [2 2; 1.0+im 2] : [2 1.0+im; 2 2]) + end +end