Skip to content

Commit 5e6f2a6

Browse files
committed
Specialize for Symmetric/Hermitian
1 parent 1b69850 commit 5e6f2a6

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

src/symmetric.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,19 @@ function fillstored!(A::HermOrSym{T}, x) where T
414414
return A
415415
end
416416

417+
function fillband!(A::HermOrSym, x, l, u)
418+
if isa(A, Hermitian)
419+
ishermitian(x) || throw(ArgumentError("cannot fill Hermitian matrix with a non-hermitian value"))
420+
elseif isa(A, Symmetric)
421+
issymmetric(x) || throw(ArgumentError("cannot fill Symmetric matrix with an asymmetric value"))
422+
end
423+
l == -u || throw(ArgumentError(lazy"lower and upper bands must be equal in magnitude and opposite in sign, got l=$(l), u=$(u)"))
424+
lp = A.uplo == 'U' ? 0 : l
425+
up = A.uplo == 'U' ? u : 0
426+
applytri(A -> fillband!(A, x, lp, up), A)
427+
return A
428+
end
429+
417430
Base.isreal(A::HermOrSym{<:Real}) = true
418431
function Base.isreal(A::HermOrSym)
419432
n = size(A, 1)

test/symmetric.jl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,4 +1257,24 @@ end
12571257
end
12581258
end
12591259

1260+
@testset "fillband!" begin
1261+
A = zeros(4,4)
1262+
@testset for T in (Symmetric, Hermitian), uplo in (:U, :L)
1263+
A .= 0
1264+
S = T(A, uplo)
1265+
LinearAlgebra.fillband!(S, 2, -2, 2)
1266+
@test all(all(==(2), diagview(S, k)) for k in -2:2)
1267+
@test iszero(diagview(S, -3))
1268+
@test iszero(diagview(S, 3))
1269+
LinearAlgebra.fillband!(S, 4, -1, 1)
1270+
@test all(all(==(4), diagview(S, k)) for k in -1:1)
1271+
@test all(==(2), diagview(S, -2))
1272+
@test all(==(2), diagview(S, 2))
1273+
end
1274+
msg = "cannot fill Hermitian matrix with a non-hermitian value"
1275+
@test_throws msg LinearAlgebra.fillband!(Hermitian(A), 2im, -3, 3)
1276+
msg = "lower and upper bands must be equal in magnitude and opposite in sign, got l=0, u=1"
1277+
@test_throws msg LinearAlgebra.fillband!(Symmetric(A), 2, 0, 1)
1278+
end
1279+
12601280
end # module TestSymmetric

0 commit comments

Comments
 (0)