@@ -54,23 +54,100 @@ plan_chebyshevtransform(x::AbstractArray, dims...; kws...) = plan_chebyshevtrans
5454@inline _plan_mul! (y:: AbstractArray{T} , P:: Plan{T} , x:: StridedArray{T} ) where T = mul! (y, P, x)
5555@inline _plan_mul! (y:: AbstractArray{T} , P:: Plan{T} , x:: AbstractArray ) where T = mul! (y, P, convert (Array{T}, x))
5656
57- @inline _cheb1_rescale! (_, y:: AbstractVector ) = (y[1 ] /= 2 ; ldiv! (length (y), y))
5857
59- @inline function _cheb1_rescale! (d:: Number , y:: AbstractMatrix{T} ) where T
58+
59+ ldiv_dim_begin! (α, d:: Number , y:: AbstractVector ) = y[1 ] /= α
60+ function ldiv_dim_begin! (α, d:: Number , y:: AbstractMatrix )
61+ if isone (d)
62+ ldiv! (α, @view (y[1 ,:]))
63+ else
64+ ldiv! (α, @view (y[:,1 ]))
65+ end
66+ end
67+ function ldiv_dim_begin! (α, d:: Number , y:: AbstractArray{<:Any,3} )
68+ if isone (d)
69+ ldiv! (α, @view (y[1 ,:,:]))
70+ elseif d == 2
71+ ldiv! (α, @view (y[:,1 ,:]))
72+ else # d == 3
73+ ldiv! (α, @view (y[:,:,1 ]))
74+ end
75+ end
76+
77+ ldiv_dim_end! (α, d:: Number , y:: AbstractVector ) = y[end ] /= α
78+ function ldiv_dim_end! (α, d:: Number , y:: AbstractMatrix )
79+ if isone (d)
80+ ldiv! (α, @view (y[end ,:]))
81+ else
82+ ldiv! (α, @view (y[:,end ]))
83+ end
84+ end
85+ function ldiv_dim_end! (α, d:: Number , y:: AbstractArray{<:Any,3} )
86+ if isone (d)
87+ ldiv! (α, @view (y[end ,:,:]))
88+ elseif d == 2
89+ ldiv! (α, @view (y[:,end ,:]))
90+ else # d == 3
91+ ldiv! (α, @view (y[:,:,end ]))
92+ end
93+ end
94+
95+ lmul_dim_begin! (α, d:: Number , y:: AbstractVector ) = y[1 ] *= α
96+ function lmul_dim_begin! (α, d:: Number , y:: AbstractMatrix )
6097 if isone (d)
61- ldiv! ( 2 , view (y, 1 ,:))
98+ lmul! (α, @ view (y[ 1 ,:] ))
6299 else
63- ldiv! (2 , view (y,:,1 ))
100+ lmul! (α, @view (y[:,1 ]))
101+ end
102+ end
103+ function lmul_dim_begin! (α, d:: Number , y:: AbstractArray{<:Any,3} )
104+ if isone (d)
105+ lmul! (α, @view (y[1 ,:,:]))
106+ elseif d == 2
107+ lmul! (α, @view (y[:,1 ,:]))
108+ else # d == 3
109+ lmul! (α, @view (y[:,:,1 ]))
64110 end
111+ end
112+
113+ lmul_dim_end! (α, d:: Number , y:: AbstractVector ) = y[end ] *= α
114+ function lmul_dim_end! (α, d:: Number , y:: AbstractMatrix )
115+ if isone (d)
116+ lmul! (α, @view (y[end ,:]))
117+ else
118+ lmul! (α, @view (y[:,end ]))
119+ end
120+ end
121+ function lmul_dim_end! (α, d:: Number , y:: AbstractArray{<:Any,3} )
122+ if isone (d)
123+ lmul! (α, @view (y[end ,:,:]))
124+ elseif d == 2
125+ lmul! (α, @view (y[:,end ,:]))
126+ else # d == 3
127+ lmul! (α, @view (y[:,:,end ]))
128+ end
129+ end
130+
131+
132+ @inline function _cheb1_rescale! (d:: Number , y:: AbstractArray )
133+ ldiv_dim_begin! (2 , d, y)
65134 ldiv! (size (y,d), y)
66135end
67136
68- # TODO : higher dimensional arrays
69- @inline function _cheb1_rescale! (d:: UnitRange , y:: AbstractMatrix{T} ) where T
70- @assert d == 1 : 2
71- ldiv! (2 , view (y,1 ,:))
72- ldiv! (2 , view (y,:,1 ))
73- ldiv! (prod (size (y)), y)
137+ function _prod_size (sz, d)
138+ ret = 1
139+ for k in d
140+ ret *= sz[k]
141+ end
142+ ret
143+ end
144+
145+
146+ @inline function _cheb1_rescale! (d:: UnitRange , y:: AbstractArray )
147+ for k in d
148+ ldiv_dim_begin! (2 , k, y)
149+ end
150+ ldiv! (_prod_size (size (y), d), y)
74151end
75152
76153function * (P:: ChebyshevTransformPlan{T,1,K,true,N} , x:: AbstractArray{T,N} ) where {T,K,N}
@@ -90,27 +167,21 @@ function mul!(y::AbstractArray{T,N}, P::ChebyshevTransformPlan{T,1,K,false,N}, x
90167end
91168
92169
93- _cheb2_rescale! (_, y:: AbstractVector ) = (y[1 ] /= 2 ; y[end ] /= 2 ; ldiv! (length (y)- 1 , y))
94170
95- function _cheb2_rescale! (d:: Number , y:: AbstractMatrix{T} ) where T
96- if isone (d)
97- ldiv! (2 , @view (y[1 ,:]))
98- ldiv! (2 , @view (y[end ,:]))
99- else
100- ldiv! (2 , @view (y[:,1 ]))
101- ldiv! (2 , @view (y[:,end ]))
102- end
171+ function _cheb2_rescale! (d:: Number , y:: AbstractArray )
172+ ldiv_dim_begin! (2 , d, y)
173+ ldiv_dim_end! (2 , d, y)
103174 ldiv! (size (y,d)- 1 , y)
104175end
105176
106177# TODO : higher dimensional arrays
107- function _cheb2_rescale! (d:: UnitRange , y:: AbstractMatrix{T} ) where T
108- @assert d == 1 : 2
109- ldiv ! (2 , @view (y[ 1 ,:]) )
110- ldiv ! (2 , @view (y[ end ,:]) )
111- ldiv! ( 2 , @view (y[:, 1 ]))
112- ldiv! ( 2 , @view (y[:, end ]))
113- ldiv! (prod (size (y) .- 1 ), y)
178+ function _cheb2_rescale! (d:: UnitRange , y:: AbstractArray )
179+ for k in d
180+ ldiv_dim_begin ! (2 , k, y )
181+ ldiv_dim_end ! (2 , k, y )
182+ end
183+
184+ ldiv! (_prod_size (size (y) .- 1 , d ), y)
114185end
115186
116187function * (P:: ChebyshevTransformPlan{T,2,K,true,N} , x:: AbstractArray{T,N} ) where {T,K,N}
@@ -200,33 +271,25 @@ end
200271plan_ichebyshevtransform! (x:: AbstractArray , dims... ; kws... ) = plan_ichebyshevtransform! (x, Val (1 ), dims... ; kws... )
201272plan_ichebyshevtransform (x:: AbstractArray , dims... ; kws... ) = plan_ichebyshevtransform (x, Val (1 ), dims... ; kws... )
202273
203- @inline _icheb1_prescale! (_, x:: AbstractVector ) = (x[1 ] *= 2 )
204- @inline function _icheb1_prescale! (d:: Number , x:: AbstractMatrix )
205- if isone (d)
206- lmul! (2 , view (x,1 ,:))
207- else
208- lmul! (2 , view (x,:,1 ))
209- end
274+ @inline function _icheb1_prescale! (d:: Number , x:: AbstractArray )
275+ lmul_dim_begin! (2 , d, x)
210276 x
211277end
212- @inline function _icheb1_prescale! (d:: UnitRange , x:: AbstractMatrix )
213- lmul! (2 , view (x,:,1 ))
214- lmul! (2 , view (x,1 ,:))
278+ @inline function _icheb1_prescale! (d:: UnitRange , x:: AbstractArray )
279+ for k in d
280+ _icheb1_prescale! (k, x)
281+ end
215282 x
216283end
217- @inline _icheb1_postscale! (_, x:: AbstractVector ) = (x[1 ] /= 2 )
218- @inline function _icheb1_postscale! (d:: Number , x:: AbstractMatrix )
219- if isone (d)
220- ldiv! (2 , view (x,1 ,:))
221- else
222- ldiv! (2 , view (x,:,1 ))
223- end
284+ @inline function _icheb1_postscale! (d:: Number , x:: AbstractArray )
285+ ldiv_dim_begin! (2 , d, x)
224286 x
225287end
226288
227- @inline function _icheb1_postscale! (d:: UnitRange , x:: AbstractMatrix )
228- ldiv! (2 , view (x,1 ,:))
229- ldiv! (2 , view (x,:,1 ))
289+ @inline function _icheb1_postscale! (d:: UnitRange , x:: AbstractArray )
290+ for k in d
291+ _icheb1_postscale! (k, x)
292+ end
230293 x
231294end
232295
@@ -249,40 +312,27 @@ function mul!(y::AbstractArray{T,N}, P::IChebyshevTransformPlan{T,1,K,false,N},
249312 ldiv! (2 ^ length (P. plan. region), y)
250313end
251314
252- @inline _icheb2_prescale! (_, x:: AbstractVector ) = (x[1 ] *= 2 ; x[end ] *= 2 )
253- @inline function _icheb2_prescale! (d:: Number , x:: AbstractMatrix )
254- if isone (d)
255- lmul! (2 , @view (x[1 ,:]))
256- lmul! (2 , @view (x[end ,:]))
257- else
258- lmul! (2 , @view (x[:,1 ]))
259- lmul! (2 , @view (x[:,end ]))
260- end
315+ @inline function _icheb2_prescale! (d:: Number , x:: AbstractArray )
316+ lmul_dim_begin! (2 , d, x)
317+ lmul_dim_end! (2 , d, x)
261318 x
262319end
263- @inline function _icheb2_prescale! (d:: UnitRange , x:: AbstractMatrix )
264- lmul! (2 , @view (x[1 ,:]))
265- lmul! (2 , @view (x[end ,:]))
266- lmul! (2 , @view (x[:,1 ]))
267- lmul! (2 , @view (x[:,end ]))
320+ @inline function _icheb2_prescale! (d:: UnitRange , x:: AbstractArray )
321+ for k in d
322+ _icheb2_prescale! (k, x)
323+ end
268324 x
269325end
270- @inline _icheb2_postrescale! (_, x:: AbstractVector ) = (x[1 ] /= 2 ; x[end ] /= 2 )
271- @inline function _icheb2_postrescale! (d:: Number , x:: AbstractMatrix )
272- if isone (d)
273- ldiv! (2 , @view (x[1 ,:]))
274- ldiv! (2 , @view (x[end ,:]))
275- else
276- ldiv! (2 , @view (x[:,1 ]))
277- ldiv! (2 , @view (x[:,end ]))
278- end
326+
327+ @inline function _icheb2_postrescale! (d:: Number , x:: AbstractArray )
328+ ldiv_dim_begin! (2 , d, x)
329+ ldiv_dim_end! (2 , d, x)
279330 x
280331end
281- @inline function _icheb2_postrescale! (d:: UnitRange , x:: AbstractMatrix )
282- ldiv! (2 , @view (x[1 ,:]))
283- ldiv! (2 , @view (x[end ,:]))
284- ldiv! (2 , @view (x[:,1 ]))
285- ldiv! (2 , @view (x[:,end ]))
332+ @inline function _icheb2_postrescale! (d:: UnitRange , x:: AbstractArray )
333+ for k in d
334+ _icheb2_postrescale! (k, x)
335+ end
286336 x
287337end
288338@inline function _icheb2_rescale! (d:: Number , y:: AbstractArray{T} ) where T
292342end
293343@inline function _icheb2_rescale! (d:: UnitRange , y:: AbstractArray{T} ) where T
294344 _icheb2_prescale! (d, y)
295- lmul! (prod (convert .(T, size (y) .- 1 )./ 2 ), y)
345+ lmul! (_prod_size (convert .(T, size (y) .- 1 )./ 2 , d ), y)
296346 y
297347end
298348
0 commit comments