Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/LinearAlgebra.jl
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,8 @@ public AbstractTriangular,
symmetric,
symmetric_type,
zeroslike,
matprod_dest
matprod_dest,
fillstored!

const BlasFloat = Union{Float64,Float32,ComplexF64,ComplexF32}
const BlasReal = Union{Float64,Float32}
Expand Down
5 changes: 4 additions & 1 deletion src/special.jl
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,10 @@ _diag_or_value(A::UniformScaling) = A.λ
fillstored!(A::Diagonal, x) = (fill!(A.diag, x); A)
fillstored!(A::Bidiagonal, x) = (fill!(A.dv, x); fill!(A.ev, x); A)
fillstored!(A::Tridiagonal, x) = (fill!(A.dl, x); fill!(A.d, x); fill!(A.du, x); A)
fillstored!(A::SymTridiagonal, x) = (fill!(A.dv, x); fill!(A.ev, x); A)
function fillstored!(A::SymTridiagonal, x)
issymmetric(x) || throw(ArgumentError("cannot set a diagonal entry of a SymTridiagonal to an asymmetric value"))
(fill!(A.dv, x); fill!(A.ev, x); A)
end

_small_enough(A::Union{Diagonal, Bidiagonal}) = size(A, 1) <= 1
_small_enough(A::Tridiagonal) = size(A, 1) <= 2
Expand Down
10 changes: 4 additions & 6 deletions src/symmetric.jl
Original file line number Diff line number Diff line change
Expand Up @@ -402,13 +402,11 @@ 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)
ishermitian(xT) || throw(ArgumentError("cannot fill Hermitian matrix with a non-hermitian value"))
elseif isa(A, Symmetric)
issymmetric(xT) || throw(ArgumentError("cannot fill Symmetric matrix with an asymmetric value"))
end
applytri(A -> fillstored!(A, xT), A)
return A
end

Expand Down
24 changes: 24 additions & 0 deletions test/special.jl
Original file line number Diff line number Diff line change
Expand Up @@ -841,4 +841,28 @@ end
end
end

@testset "fillstored!" begin
dv, ev = zeros(4), zeros(3)
D = Diagonal(dv)
LinearAlgebra.fillstored!(D, 2)
@test D == diagm(fill(2, length(dv)))

dv .= 0
B = Bidiagonal(dv, ev, :U)
LinearAlgebra.fillstored!(B, 2)
@test B == diagm(0=>fill(2, length(dv)), 1=>fill(2, length(ev)))

dv .= 0
ev .= 0
T = Tridiagonal(ev, dv, ev)
LinearAlgebra.fillstored!(T, 2)
@test T == diagm(-1=>fill(2, length(ev)), 0=>fill(2, length(dv)), 1=>fill(2, length(ev)))

dv .= 0
ev .= 0
ST = SymTridiagonal(dv, ev)
LinearAlgebra.fillstored!(ST, 2)
@test ST == diagm(-1=>fill(2, length(ev)), 0=>fill(2, length(dv)), 1=>fill(2, length(ev)))
end

end # module TestSpecial
9 changes: 9 additions & 0 deletions test/symmetric.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1191,4 +1191,13 @@ end
@test_throws s_msg S[1,1] = v
end

@testset "fillstored!" begin
A = zeros(4,4)
for T in (Symmetric, Hermitian)
A .= 0
LinearAlgebra.fillstored!(T(A), 2)
@test all(==(2), T(A))
end
end

end # module TestSymmetric