-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathAlmostBandedMatrix.jl
More file actions
58 lines (42 loc) · 1.7 KB
/
AlmostBandedMatrix.jl
File metadata and controls
58 lines (42 loc) · 1.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
## AlmostBandedMatrix
struct AlmostBandedMatrix{T} <: AbstractMatrix{T}
bands::BandedMatrix{T,Matrix{T},Base.OneTo{Int}}
fill::LowRankMatrix{T}
function AlmostBandedMatrix{T}(bands::BandedMatrix{T}, fill::LowRankMatrix{T}) where T
if size(bands) ≠ size(fill)
error("Data and fill must be compatible size")
end
new{T}(bands,fill)
end
end
AlmostBandedMatrix(bands::BandedMatrix, fill::LowRankMatrix) =
AlmostBandedMatrix{promote_type(eltype(bands),eltype(fill))}(bands,fill)
AlmostBandedMatrix{T}(nm::NTuple{2,Integer}, lu::NTuple{2,Integer}, r::Integer) where {T} =
AlmostBandedMatrix(BandedMatrix{T}(nm,lu), LowRankMatrix{T}(nm,r))
AlmostBandedMatrix{T}(Z::Zeros, lu::NTuple{2,Integer}, r::Integer) where {T} =
AlmostBandedMatrix(BandedMatrix{T}(Z, lu), LowRankMatrix{T}(Z, r))
AlmostBandedMatrix(Z::AbstractMatrix, lu::NTuple{2,Integer}, r::Integer) =
AlmostBandedMatrix{eltype(Z)}(Z, lu, r)
for MAT in (:AlmostBandedMatrix, :AbstractMatrix, :AbstractArray)
@eval convert(::Type{$MAT{T}}, A::AlmostBandedMatrix) where {T} =
AlmostBandedMatrix(AbstractMatrix{T}(A.bands),AbstractMatrix{T}(A.fill))
end
size(A::AlmostBandedMatrix) = size(A.bands)
Base.IndexStyle(::Type{ABM}) where {ABM<:AlmostBandedMatrix} =
IndexCartesian()
function getindex(B::AlmostBandedMatrix,k::Integer,j::Integer)
if j > k + bandwidth(B.bands,2)
B.fill[k,j]
else
B.bands[k,j]
end
end
# can only change the bands, not the fill
function setindex!(B::AlmostBandedMatrix,v,k::Integer,j::Integer)
B.bands[k,j] = v
end
function pad!(B::AlmostBandedMatrix,n::Integer,m::Integer)
pad!(B.bands,n,m)
pad!(B.fill,n,m)
B
end