@@ -95,6 +95,7 @@ function _diagtravgetindex(::AbstractPaddedLayout{<:AbstractStridedLayout}, A::A
9595 end
9696end
9797
98+
9899function _diagtravgetindex (:: AbstractStridedLayout , A:: AbstractArray{T,3} , K:: Block{1} ) where T
99100 k = Int (K)
100101 m,n,p = size (A)
@@ -103,7 +104,7 @@ function _diagtravgetindex(::AbstractStridedLayout, A::AbstractArray{T,3}, K::Bl
103104 st3 = stride (A,3 )
104105 ret = T[]
105106 for j = 0 : k- 1
106- append! (ret, view (A, range (j* st + k- j; step= st3- st, length= j+ 1 )))
107+ append! (ret, view (A, range (j* st + k- j; step= st3- st, length= j+ 1 ))) # this matches lexigraphical order
107108 end
108109 ret
109110end
152153size (A:: InvDiagTrav ) = (blocksize (A. vector,1 ),blocksize (A. vector,1 ))
153154
154155function getindex (A:: InvDiagTrav{T} , k:: Int , j:: Int ) where T
155- if k+ j- 1 ≤ blocksize (A. vector,1 )
156+ if k+ j- 1 ≤ blocksize (A. vector,1 )
156157 A. vector[Block (k+ j- 1 )][j]
157158 else
158159 zero (T)
@@ -185,20 +186,35 @@ KronTrav(A::AbstractArray...) = KronTrav{mapreduce(eltype, promote_type, A)}(A..
185186copy (K:: KronTrav ) = KronTrav (map (copy,K. args), K. axes)
186187axes (A:: KronTrav ) = A. axes
187188
188- function getindex (M:: KronTrav{<:Any,1} , K:: Block{1} )
189- A,B = M. args
189+
190+
191+ function _krontrav_getindex (K:: Block{1} , A, B)
190192 m,n = length (A), length (B)
191193 mn = min (m,n)
192194 k = Int (K)
193- if k ≤ mn
195+ if k ≤ mn
194196 A[1 : k] .* B[k: - 1 : 1 ]
195- elseif m < n
197+ elseif m < n
196198 A .* B[k: - 1 : (k- m+ 1 )]
197199 else # n < m
198200 A[(k- n+ 1 ): k] .* B[end : - 1 : 1 ]
199201 end
200202end
201203
204+
205+
206+ function _krontrav_getindex (K:: Block{1} , A, B, C)
207+ @assert length (A) == length (B) == length (C) # TODO : generalise
208+
209+ # make a tuple corresponding to lexigraphical order
210+ ret = Vector {promote_type(eltype(A),eltype(B),eltype(C))} ()
211+ n = Int (K)
212+ for k = 1 : n, j= 1 : k
213+ push! (ret, C[n- k+ 1 ]B[k- j+ 1 ]A[j])
214+ end
215+ ret
216+ end
217+
202218function _krontrav_getindex (K:: Block{2} , A, B)
203219 m,n = size (A), size (B)
204220 @assert m == n
@@ -219,6 +235,7 @@ function _krontrav_getindex(Kin::Block{2}, A, B, C)
219235 AB
220236end
221237
238+ getindex (M:: KronTrav{<:Any,1} , K:: Block{1} ) = _krontrav_getindex (K, M. args... )
222239getindex (M:: KronTrav{<:Any,2} , K:: Block{2} ) = _krontrav_getindex (K, M. args... )
223240
224241
0 commit comments