@@ -54,23 +54,100 @@ plan_chebyshevtransform(x::AbstractArray, dims...; kws...) = plan_chebyshevtrans
54
54
@inline _plan_mul! (y:: AbstractArray{T} , P:: Plan{T} , x:: StridedArray{T} ) where T = mul! (y, P, x)
55
55
@inline _plan_mul! (y:: AbstractArray{T} , P:: Plan{T} , x:: AbstractArray ) where T = mul! (y, P, convert (Array{T}, x))
56
56
57
- @inline _cheb1_rescale! (_, y:: AbstractVector ) = (y[1 ] /= 2 ; ldiv! (length (y), y))
58
57
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 )
60
97
if isone (d)
61
- ldiv! ( 2 , view (y, 1 ,:))
98
+ lmul! (α, @ view (y[ 1 ,:] ))
62
99
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 ]))
64
110
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)
65
134
ldiv! (size (y,d), y)
66
135
end
67
136
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)
74
151
end
75
152
76
153
function * (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
90
167
end
91
168
92
169
93
- _cheb2_rescale! (_, y:: AbstractVector ) = (y[1 ] /= 2 ; y[end ] /= 2 ; ldiv! (length (y)- 1 , y))
94
170
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)
103
174
ldiv! (size (y,d)- 1 , y)
104
175
end
105
176
106
177
# 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)
114
185
end
115
186
116
187
function * (P:: ChebyshevTransformPlan{T,2,K,true,N} , x:: AbstractArray{T,N} ) where {T,K,N}
@@ -200,33 +271,25 @@ end
200
271
plan_ichebyshevtransform! (x:: AbstractArray , dims... ; kws... ) = plan_ichebyshevtransform! (x, Val (1 ), dims... ; kws... )
201
272
plan_ichebyshevtransform (x:: AbstractArray , dims... ; kws... ) = plan_ichebyshevtransform (x, Val (1 ), dims... ; kws... )
202
273
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)
210
276
x
211
277
end
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
215
282
x
216
283
end
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)
224
286
x
225
287
end
226
288
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
230
293
x
231
294
end
232
295
@@ -249,40 +312,27 @@ function mul!(y::AbstractArray{T,N}, P::IChebyshevTransformPlan{T,1,K,false,N},
249
312
ldiv! (2 ^ length (P. plan. region), y)
250
313
end
251
314
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)
261
318
x
262
319
end
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
268
324
x
269
325
end
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)
279
330
x
280
331
end
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
286
336
x
287
337
end
288
338
@inline function _icheb2_rescale! (d:: Number , y:: AbstractArray{T} ) where T
292
342
end
293
343
@inline function _icheb2_rescale! (d:: UnitRange , y:: AbstractArray{T} ) where T
294
344
_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)
296
346
y
297
347
end
298
348
0 commit comments