Skip to content

Commit 3b47e78

Browse files
committed
orthogonalize view methods
1 parent 327cdb8 commit 3b47e78

File tree

2 files changed

+33
-13
lines changed

2 files changed

+33
-13
lines changed

src/Operators/SubOperator.jl

+18-12
Original file line numberDiff line numberDiff line change
@@ -108,19 +108,25 @@ function view(A::Operator,kr::UnitRange,jr::UnitRange)
108108
end
109109
end
110110

111-
view(A::Operator,::Colon,::Colon) = view(A,1:size(A,1),1:size(A,2))
112-
view(A::Operator,::Colon,jr) = view(A,1:size(A,1),jr)
113-
view(A::Operator,kr,::Colon) = view(A,kr,1:size(A,2))
114-
115-
116-
view(A::Operator,K::Block,J::Block) = SubOperator(A,(K,J))
117-
view(A::Operator,K::Block,j::Colon) = view(A,blockrows(A,K),j)
118-
view(A::Operator,k::Colon,J::Block) = view(A,k,blockcols(A,J))
119-
view(A::Operator, K::Block, j) = view(A,blockrows(A,Int(K)),j)
120-
view(A::Operator, k, J::Block) = view(A,k,blockcols(A,Int(J))) #TODO: fix view
121-
view(A::Operator,KR::BlockRange,JR::BlockRange) = SubOperator(A,(KR,JR))
111+
_replace_inds(A, ax, inds::Tuple{}, out, n) = out
112+
function _replace_inds(A, ax, inds::Tuple{Any, Vararg}, out, n)
113+
outnew = (out..., inds[1])
114+
_replace_inds(A, Base.tail(ax), Base.tail(inds), outnew, n+1)
115+
end
116+
function _replace_inds(A, ax, inds::Tuple{Colon, Vararg}, out, n)
117+
outnew = (out..., ax[1])
118+
_replace_inds(A, Base.tail(ax), Base.tail(inds), outnew, n+1)
119+
end
120+
function _replace_inds(A, ax, inds::Tuple{Block, Vararg}, out, n)
121+
blkind = n == 1 ? blockrows(A, inds[1]) : n == 2 ? blockcols(A, inds[1]) : error("invalid dimension ", n)
122+
outnew = (out..., blkind)
123+
_replace_inds(A, Base.tail(ax), Base.tail(inds), outnew, n+1)
124+
end
122125

123-
view(A::Operator,k,j) = SubOperator(A,(k,j))
126+
function view(A::Operator, k, j)
127+
inds = _replace_inds(A, axes(A), (k,j), (), 1)
128+
SubOperator(A, inds)
129+
end
124130

125131
defaultgetindex(B::Operator,k::InfRanges, j::InfRanges) = view(B, k, j)
126132
defaultgetindex(B::Operator,k::AbstractRange, j::InfRanges) = view(B, k, j)

test/runtests.jl

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
using ApproxFunBase, LinearAlgebra, Random, Test
1+
using ApproxFunBase
22
import ApproxFunBase:
3+
using BlockArrays: Block
4+
using LinearAlgebra
5+
using Random
6+
using Test
37

48
@testset "Helper" begin
59
@testset "interlace" begin
@@ -217,6 +221,16 @@ end
217221
@test size(V) == (1,)
218222
@test all(==(1), V)
219223
end
224+
@testset "view" begin
225+
M = Multiplication(Fun(PointSpace(1:3), [1:3;]), PointSpace(1:3))
226+
inds = Any[:, 1:3, Block(1)]
227+
for ind1 in inds, ind2 in inds
228+
S = view(M, ind1, ind2)
229+
@test AbstractMatrix(S) == Diagonal(1:3)
230+
S2 = view(S, ind1, ind2)
231+
@test AbstractMatrix(S2) == Diagonal(1:3)
232+
end
233+
end
220234
end
221235
end
222236
@testset "conversion to a matrix" begin

0 commit comments

Comments
 (0)