Skip to content

Commit 92e2425

Browse files
authored
Wrap matrix in show for Operators (#472)
* wrap martix while displaying * Add bounds check in getindex * save isbanded * remove unnecesary function calls
1 parent 1ecfd75 commit 92e2425

File tree

1 file changed

+56
-73
lines changed

1 file changed

+56
-73
lines changed

src/show.jl

Lines changed: 56 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -44,83 +44,66 @@ Base.show(io::IO, N::PrintShow) = print(io, N.c)
4444

4545
show(io::IO, B::Operator; kw...) = summary(io, B)
4646

47-
function show(io::IO, mimetype::MIME"text/plain", @nospecialize(B::Operator); header::Bool=true)
48-
header && summary(io, B)
49-
dsp = domainspace(B)
47+
struct CharLinedMatrix{T,A<:AbstractMatrix{T}} <: AbstractMatrix{Union{T,PrintShow}}
48+
arr :: A
49+
sz :: NTuple{2,Bool}
50+
isbanded :: Bool
51+
end
52+
Base.size(A::CharLinedMatrix) = size(A.arr) .+ A.sz
53+
54+
function Base.getindex(C::CharLinedMatrix, k::Int, j::Int)
55+
@boundscheck checkbounds(C, k, j)
56+
BM = C.arr
57+
if j in axes(BM,2) && k in axes(BM,1)
58+
return C.arr[k,j]
59+
end
60+
sz1, sz2 = size(C)
61+
if C.isbanded && all(C.sz)
62+
bw1, bw2 = bandwidths(BM)
63+
if k in max(1,sz1-bw2):sz1+min(0,bw1) && j == sz2
64+
PrintShow('')
65+
elseif k == sz1 && j in max(1,sz2-bw1):sz2+min(0,bw2)
66+
PrintShow('')
67+
else
68+
PrintShow('')
69+
end
70+
elseif all(C.sz)
71+
if k == 1 && j == sz2
72+
PrintShow('')
73+
elseif k in 2:sz1 && j == sz2
74+
PrintShow('')
75+
elseif k == sz1 && j == 1
76+
PrintShow('')
77+
elseif k == sz1 && j in 2:sz2
78+
PrintShow('')
79+
end
80+
elseif C.sz[1]
81+
if k == sz1 && j in 1:sz2
82+
PrintShow('')
83+
end
84+
elseif C.sz[2]
85+
if k in 1:sz1 && j == sz2
86+
PrintShow('')
87+
end
88+
end
89+
end
5090

51-
sz1_B, sz2_B = size(B)
91+
function Base.replace_in_print_matrix(C::CharLinedMatrix, k::Integer, j::Integer, s::AbstractString)
92+
if CartesianIndex(k,j) in CartesianIndices(C.arr)
93+
Base.replace_in_print_matrix(C.arr, k, j, s)
94+
else
95+
s
96+
end
97+
end
5298

53-
iocompact = haskey(io, :compact) ? io : IOContext(io, :compact => true)
99+
function show(io::IO, mimetype::MIME"text/plain", @nospecialize(B::Operator); header::Bool=true)
100+
header && summary(io, B)
54101

55-
if !isambiguous(domainspace(B)) && (eltype(B) <: Number)
102+
if !isambiguous(domainspace(B)) && eltype(B) <: Number
56103
println(io)
57-
if isbanded(B) && isinf(sz1_B) && isinf(sz2_B)
58-
BM=B[1:10,1:10]
59-
60-
M=Matrix{Union{eltype(B), PrintShow}}(undef,11,11)
61-
fill!(M,PrintShow(''))
62-
for j = 1:size(BM,2),k = colrange(BM,j)
63-
M[k,j]=BM[k,j]
64-
end
65-
66-
for k=max(1,11-bandwidth(B,2)):11
67-
M[k,end]=PrintShow('')
68-
end
69-
for j=max(1,11-bandwidth(B,1)):10
70-
M[end,j]=PrintShow('')
71-
end
72-
73-
print_array(iocompact, M)
74-
elseif isinf(sz1_B) && isinf(sz2_B)
75-
BM=B[1:10,1:10]
76-
77-
M=Matrix{Union{eltype(B), PrintShow}}(undef,11,11)
78-
for I in CartesianIndices(axes(BM))
79-
M[I]=BM[Tuple(I)...] # not certain if indexing with CartesianIndex is implemented
80-
end
81-
82-
M[1,end]=PrintShow('')
83-
M[end,1]=PrintShow('')
84-
85-
for k=2:11
86-
M[k,end]=PrintShow('')
87-
end
88-
for k=2:11
89-
M[end,k]=PrintShow('')
90-
end
91-
92-
print_array(iocompact, M)
93-
elseif isinf(sz1_B)
94-
sz2int = Int(sz2_B)::Int
95-
BM=B[1:10,1:sz2int]
96-
97-
M=Matrix{Union{eltype(B), PrintShow}}(undef,11,sz2int)
98-
for I in CartesianIndices(axes(BM))
99-
M[I]=BM[Tuple(I)...]
100-
end
101-
for k=1:sz2int
102-
M[end,k]=PrintShow('')
103-
end
104-
105-
print_array(iocompact, M)
106-
elseif isinf(sz2_B)
107-
sz1int = Int(sz1_B)::Int
108-
BM=B[1:sz1int,1:10]
109-
110-
M=Matrix{Union{eltype(B), PrintShow}}(undef,sz1int,11)
111-
for I in CartesianIndices(axes(BM))
112-
M[I]=BM[Tuple(I)...]
113-
end
114-
for k=1:sz1int
115-
M[k,end]=PrintShow('')
116-
end
117-
118-
print_array(iocompact, M)
119-
else
120-
sz1int = Int(sz1_B)::Int
121-
sz2int = Int(sz2_B)::Int
122-
print_array(iocompact, AbstractMatrix(B)[1:sz1int,1:sz2int])
123-
end
104+
sz1, sz2 = min.(size(B), 10)
105+
C = CharLinedMatrix(B[1:sz1, 1:sz2], isinf.(size(B)), isbanded(B))
106+
print_array(io, C)
124107
end
125108
end
126109

0 commit comments

Comments
 (0)