Skip to content

Commit 72355a7

Browse files
committed
Make fillstored! public
1 parent c9b6456 commit 72355a7

File tree

5 files changed

+43
-8
lines changed

5 files changed

+43
-8
lines changed

src/LinearAlgebra.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,8 @@ public AbstractTriangular,
179179
symmetric,
180180
symmetric_type,
181181
zeroslike,
182-
matprod_dest
182+
matprod_dest,
183+
fillstored!
183184

184185
const BlasFloat = Union{Float64,Float32,ComplexF64,ComplexF32}
185186
const BlasReal = Union{Float64,Float32}

src/special.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,10 @@ _diag_or_value(A::UniformScaling) = A.λ
323323
fillstored!(A::Diagonal, x) = (fill!(A.diag, x); A)
324324
fillstored!(A::Bidiagonal, x) = (fill!(A.dv, x); fill!(A.ev, x); A)
325325
fillstored!(A::Tridiagonal, x) = (fill!(A.dl, x); fill!(A.d, x); fill!(A.du, x); A)
326-
fillstored!(A::SymTridiagonal, x) = (fill!(A.dv, x); fill!(A.ev, x); A)
326+
function fillstored!(A::SymTridiagonal, x)
327+
issymmetric(x) || throw(ArgumentError("cannot set a diagonal entry of a SymTridiagonal to an asymmetric value"))
328+
(fill!(A.dv, x); fill!(A.ev, x); A)
329+
end
327330

328331
_small_enough(A::Union{Diagonal, Bidiagonal}) = size(A, 1) <= 1
329332
_small_enough(A::Tridiagonal) = size(A, 1) <= 2

src/symmetric.jl

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -402,13 +402,11 @@ fill!(A::HermOrSym, x) = fillstored!(A, x)
402402
function fillstored!(A::HermOrSym{T}, x) where T
403403
xT = convert(T, x)
404404
if isa(A, Hermitian)
405-
isreal(xT) || throw(ArgumentError("cannot fill Hermitian matrix with a nonreal value"))
406-
end
407-
if A.uplo == 'U'
408-
fillband!(A.data, xT, 0, size(A,2)-1)
409-
else # A.uplo == 'L'
410-
fillband!(A.data, xT, 1-size(A,1), 0)
405+
ishermitian(xT) || throw(ArgumentError("cannot fill Hermitian matrix with a non-hermitian value"))
406+
elseif isa(A, Symmetric)
407+
issymmetric(xT) || throw(ArgumentError("cannot fill Symmetric matrix with an asymmetric value"))
411408
end
409+
applytri(A -> fillstored!(A, xT), A)
412410
return A
413411
end
414412

test/special.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -841,4 +841,28 @@ end
841841
end
842842
end
843843

844+
@testset "fillstored!" begin
845+
dv, ev = zeros(4), zeros(3)
846+
D = Diagonal(dv)
847+
LinearAlgebra.fillstored!(D, 2)
848+
@test D == diagm(fill(2, length(dv)))
849+
850+
dv .= 0
851+
B = Bidiagonal(dv, ev, :U)
852+
LinearAlgebra.fillstored!(B, 2)
853+
@test B == diagm(0=>fill(2, length(dv)), 1=>fill(2, length(ev)))
854+
855+
dv .= 0
856+
ev .= 0
857+
T = Tridiagonal(ev, dv, ev)
858+
LinearAlgebra.fillstored!(T, 2)
859+
@test T == diagm(-1=>fill(2, length(ev)), 0=>fill(2, length(dv)), 1=>fill(2, length(ev)))
860+
861+
dv .= 0
862+
ev .= 0
863+
ST = SymTridiagonal(dv, ev)
864+
LinearAlgebra.fillstored!(ST, 2)
865+
@test ST == diagm(-1=>fill(2, length(ev)), 0=>fill(2, length(dv)), 1=>fill(2, length(ev)))
866+
end
867+
844868
end # module TestSpecial

test/symmetric.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1191,4 +1191,13 @@ end
11911191
@test_throws s_msg S[1,1] = v
11921192
end
11931193

1194+
@testset "fillstored!" begin
1195+
A = zeros(4,4)
1196+
for T in (Symmetric, Hermitian)
1197+
A .= 0
1198+
LinearAlgebra.fillstored!(T(A), 2)
1199+
@test all(==(2), T(A))
1200+
end
1201+
end
1202+
11941203
end # module TestSymmetric

0 commit comments

Comments
 (0)