@@ -22,7 +22,7 @@ function repeatgrid(ax, g, pts)
2222 for j in axes (ret, 2 )
2323 ret[:, j] = affine (ax, pts[j] .. pts[j+ 1 ])[g]
2424 end
25- ret
25+ return ret
2626end
2727
2828
@@ -83,12 +83,10 @@ function _perm_blockvec(X::AbstractArray{T,3}, dims=1) where T
8383 for k = 2 : size (X,3 )
8484 ret[:,k] = _perm_blockvec (X[:,:,k])
8585 end
86- ret
86+ return ret
8787end
8888
8989
90-
91-
9290function _perm_blockvec (X:: AbstractArray{T,4} , dims= (1 ,2 )) where T
9391 @assert dims == 1 : 2 || dims == (1 ,2 )
9492 X1 = _perm_blockvec (X[:,:,1 ,1 ])
@@ -97,18 +95,48 @@ function _perm_blockvec(X::AbstractArray{T,4}, dims=(1,2)) where T
9795 for k = axes (X,1 ), j = axes (X,2 ), l = axes (X,3 ), m = axes (X,4 )
9896 ret[Block (k)[j], Block (l)[m]] = X[k,j,l,m]
9997 end
100- ret
98+ return ret
10199end
102100
103101function _inv_perm_blockvec (X:: AbstractMatrix{T} , dims= (1 ,2 )) where T
104- @assert dims == 1 : 2 || dims == (1 ,2 )
102+ @assert dims == 1 : 2 || dims == (1 ,2 ) || dims == 1
105103 M,N = blocksize (X)
106104 m,n = size (X)
107- ret = Array {T} (undef, M, m ÷ M, N, n ÷ N)
108- for k = axes (ret,1 ), j = axes (ret,2 ), l = axes (ret,3 ), m = axes (ret,4 )
109- ret[k,j,l,m] = X[Block (k)[j], Block (l)[m]]
105+ if dims == 1 : 2 || dims == (1 ,2 )
106+ ret = Array {T} (undef, M, m ÷ M, N, n ÷ N)
107+ for k = axes (ret,1 ), j = axes (ret,2 ), l = axes (ret,3 ), m = axes (ret,4 )
108+ ret[k,j,l,m] = X[Block (k)[j], Block (l)[m]]
109+ end
110+ elseif dims == 1
111+ ret = Array {T} (undef, M, m ÷ M, n ÷ N)
112+ for k = axes (ret,1 ), j = axes (ret,2 ), l = axes (ret,3 )
113+ ret[k,j,l] = X[Block (k)[j], Block (1 )[l]]
114+ end
115+ end
116+ return ret
117+ end
118+
119+ function _perm_blockvec (X:: AbstractArray{T,5} , dims= (1 ,2 )) where T
120+ @assert dims == 1 : 2 || dims == (1 ,2 )
121+ X1 = _perm_blockvec (X[:,:,:,:,1 ])
122+ ret = BlockedArray {T} (undef, (axes (X1,1 ), axes (X1,2 ), axes (X,5 )))
123+ ret[:, :, 1 ] = X1
124+ for k = 2 : lastindex (ret,3 )
125+ ret[:, :, k] = _perm_blockvec (X[:,:,:,:,k])
110126 end
111- ret
127+ return ret
128+ end
129+
130+ function _inv_perm_blockvec (X:: AbstractArray{T,3} , dims= (1 ,2 )) where T
131+ @assert dims == 1 : 2 || dims == (1 ,2 )
132+ M,N,L = blocksize (X)
133+ m,n,ℓ = size (X)
134+
135+ ret = Array {T} (undef, M, m ÷ M, N, n ÷ N, ℓ÷ L)
136+ for k = axes (ret,5 )
137+ ret[:,:,:,:,k] = _inv_perm_blockvec (X[:,:,k])
138+ end
139+ return ret
112140end
113141
114142\ (F:: ApplyPlan{<:Any,typeof(_perm_blockvec)} , X:: AbstractArray ) = F. F \ _inv_perm_blockvec (X, F. args... )
@@ -137,6 +165,13 @@ function plan_transform(P::PiecewisePolynomial, (M,n)::Tuple{Block{1},Int}, dims
137165 ApplyPlan (_perm_blockvec, F, (dims,))
138166end
139167
168+ function plan_transform (P:: PiecewisePolynomial , (N,M,n):: Tuple{Block{1},Block{1},Int} , dims= ntuple (identity,Val (2 )))
169+ @assert dims == 1 : 2 || dims == ntuple (identity,Val (2 ))
170+ Ns = (N,M)
171+ F = plan_transform (P. basis, (_interlace_const (length (P. points)- 1 , Int .(Ns)... )... , n), _doubledims (dims... ))
172+ ApplyPlan (_perm_blockvec, F, (dims,))
173+ end
174+
140175function factorize (V:: SubQuasiArray{<:Any,2,<:PiecewisePolynomial,<:Tuple{Inclusion,BlockSlice}} , dims... )
141176 P = parent (V)
142177 _,JR = parentindices (V)
0 commit comments