@@ -245,35 +245,35 @@ getindex(B::Operator,k::Block{2}) = B[Block.(k.n)...]
245
245
246
246
# # override getindex.
247
247
248
- defaultgetindex (B:: Operator ,k:: Integer ) = error (" Override [k] for $(typeof (B)) " )
249
- defaultgetindex (B:: Operator ,k:: Integer ,j:: Integer ) = error (" Override [k,j] for $(typeof (B)) " )
250
-
248
+ defaultgetindex (B:: Operator ,k:: Integer ) =
249
+ error (" Override getindex(::$(typeof (B)) , ::Integer)" )
250
+ defaultgetindex (B:: Operator ,k:: Integer ,j:: Integer ) =
251
+ error (" Override getindex(::$(typeof (B)) , ::Integer, ::Integer)" )
252
+ defaultgetindex (A:: Operator ,kj:: CartesianIndex ) = A[Tuple (kj)... ]
251
253
252
254
# Ranges
253
255
256
+ index_ndim (:: Integer ) = 0
257
+ index_ndim (:: Union{AbstractVector, Block, Colon} ) = 1
258
+ index_ndims (inds... ) = Val (sum (index_ndim, inds))
254
259
255
- defaultgetindex (op:: Operator ,kr:: AbstractRange ) = eltype (op)[op[k] for k in kr]
256
- defaultgetindex (B:: Operator ,k:: Block ,j:: Block ) = AbstractMatrix (view (B,k,j))
257
- defaultgetindex (B:: Operator ,k:: AbstractRange ,j:: Block ) = AbstractMatrix (view (B,k,j))
258
- defaultgetindex (B:: Operator ,k:: Block ,j:: AbstractRange ) = AbstractMatrix (view (B,k,j))
259
- defaultgetindex (B:: Operator ,k:: AbstractRange ,j:: AbstractRange ) = AbstractMatrix (view (B,k,j))
260
-
261
- defaultgetindex (op:: Operator ,k:: Integer ,jr:: AbstractRange ) = eltype (op)[op[k,j] for j in jr]
262
- defaultgetindex (op:: Operator ,kr:: AbstractRange ,j:: Integer ) = eltype (op)[op[k,j] for k in kr]
263
-
264
- defaultgetindex (B:: Operator ,k:: Block ,j:: BlockRange ) = AbstractMatrix (view (B,k,j))
265
- defaultgetindex (B:: Operator ,k:: BlockRange ,j:: BlockRange ) = AbstractMatrix (view (B,k,j))
260
+ select_vectorinds (a, b... ) = a
261
+ select_vectorinds (a:: Integer , b... ) = select_vectorinds (b... )
266
262
267
- defaultgetindex (op:: Operator ,k:: Integer ,jr:: BlockRange ) = eltype (op)[op[k,j] for j in jr]
268
- defaultgetindex (op:: Operator ,kr:: BlockRange ,j:: Integer ) = eltype (op)[op[k,j] for k in kr]
263
+ combine_inds (inds:: Tuple , k) = (k, combine_inds (inds[2 : end ], k)... )
264
+ combine_inds (inds:: Tuple{Integer,Vararg} , k) = (inds[1 ], combine_inds (inds[2 : end ], k)... )
265
+ combine_inds (:: Tuple{} , k) = ()
269
266
267
+ defaultgetindex (B:: Operator , kj... ) = defaultgetindex (B, index_ndims (kj... ), kj... )
270
268
271
- # Colon casdes
272
- defaultgetindex (A:: Operator ,kj:: CartesianIndex{2} ) = A[kj[1 ],kj[2 ]]
273
- defaultgetindex (A:: Operator ,kj:: CartesianIndex{1} ) = A[kj[1 ]]
274
- defaultgetindex (A:: Operator ,k,j) = view (A,k,j)
275
-
269
+ defaultgetindex (op:: Operator , :: Val{1} , inds... ) =
270
+ eltype (op)[op[combine_inds (inds, k)... ] for k in select_vectorinds (inds... )]
276
271
272
+ function defaultgetindex (B:: Operator , :: Val{2} , inds... )
273
+ S = view (B,inds... )
274
+ all (isfinite, size (S)) || return S
275
+ AbstractMatrix (S)
276
+ end
277
277
278
278
# TODO : finite dimensional blocks
279
279
blockcolstart (A:: Operator , J:: Block{1} ) = Block (max (1 ,Int (J)- blockbandwidth (A,2 )))
0 commit comments