From 60f23df00a428919f69c072a3149198d5bf86672 Mon Sep 17 00:00:00 2001 From: Fredrik Ekre Date: Tue, 12 Dec 2017 22:26:22 +0100 Subject: [PATCH] implement fillband! and call it from fillstored!(::AbstractTriangular) --- base/linalg/dense.jl | 16 ++++++++++++++++ base/linalg/triangular.jl | 5 ++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/base/linalg/dense.jl b/base/linalg/dense.jl index 1adbfc683ce784..bab10937169792 100644 --- a/base/linalg/dense.jl +++ b/base/linalg/dense.jl @@ -242,6 +242,22 @@ function tril!(M::AbstractMatrix, k::Integer) end tril(M::Matrix, k::Integer) = tril!(copy(M), k) +""" + fillband!(A::AbstractMatrix, x, l, u) + +Fill the band between diagonals `l` and `u` with the value `x`. +""" +function fillband!(A::AbstractMatrix{T}, x, l, u) where T + m, n = size(A) + xT = convert(T, x) + for j in 1:n + for i in max(1,j-u):min(m,j-l) + @inbounds A[i, j] = xT + end + end + return A +end + function diagind(m::Integer, n::Integer, k::Integer=0) if !(-m <= k <= n) throw(ArgumentError(string("requested diagonal, $k, must be at least $(-m) and ", diff --git a/base/linalg/triangular.jl b/base/linalg/triangular.jl index 24f9f7cab9de5d..de33bb1f85955a 100644 --- a/base/linalg/triangular.jl +++ b/base/linalg/triangular.jl @@ -418,7 +418,10 @@ end scale!(A::Union{UpperTriangular,LowerTriangular}, c::Number) = scale!(A,A,c) scale!(c::Number, A::Union{UpperTriangular,LowerTriangular}) = scale!(A,c) -fillstored!(A::AbstractTriangular, x) = (fill!(A.data, x); A) +fillstored!(A::LowerTriangular, x) = (fillband!(A.data, x, size(A,1), 0); A) +fillstored!(A::UnitLowerTriangular, x) = (fillband!(A.data, x, size(A,1), -1); A) +fillstored!(A::UpperTriangular, x) = (fillband!(A.data, x, 0, size(A,2)); A) +fillstored!(A::UnitUpperTriangular, x) = (fillband!(A.data, x, 1, size(A,2)); A) # Binary operations +(A::UpperTriangular, B::UpperTriangular) = UpperTriangular(A.data + B.data)