@@ -53,22 +53,34 @@ _maybemutablecopy(x::StridedArray{T}, ::Type{T}) where {T} = x
53
53
_maybemutablecopy (x, T) = Array {T} (x)
54
54
@inline _plan_mul! (y:: AbstractArray{T} , P:: Plan{T} , x:: AbstractArray ) where T = mul! (y, P, _maybemutablecopy (x, T))
55
55
56
+ function applydim! (op!, X:: AbstractArray , Rpre, Rpost, ind)
57
+ for Ipost in Rpost, Ipre in Rpre
58
+ v = view (X, Ipre, ind, Ipost)
59
+ op! (v)
60
+ end
61
+ X
62
+ end
63
+ function applydim! (op!, X:: AbstractArray , d:: Integer , ind)
64
+ Rpre = CartesianIndices (axes (X)[1 : d- 1 ])
65
+ Rpost = CartesianIndices (axes (X)[d+ 1 : end ])
66
+ applydim! (op!, X, Rpre, Rpost, ind)
67
+ end
56
68
57
69
for op in (:ldiv , :lmul )
58
- op_dim_begin! = Symbol (string (op) * " _dim_begin!" )
59
- op_dim_end! = Symbol (string (op) * " _dim_end!" )
60
- op! = Symbol (string (op) * " ! " )
70
+ op_dim_begin! = Symbol (op, : _dim_begin! )
71
+ op_dim_end! = Symbol (op, : _dim_end! )
72
+ op! = Symbol (op, : ! )
61
73
@eval begin
62
- function $op_dim_begin! (α, d:: Number , y:: AbstractArray{<:Any,N} ) where N
74
+ function $op_dim_begin! (α, d:: Number , y:: AbstractArray )
63
75
# scale just the d-th dimension by permuting it to the first
64
- ỹ = PermutedDimsArray (y, _permfirst (d, N ))
65
- $ op! (α, view (ỹ, 1 , ntuple (_ -> :, Val (N - 1 )) ... ) )
76
+ d ∈ 1 : ndims (y) || throw ( ArgumentError ( " dimension $d must lie between 1 and $( ndims (y)) " ))
77
+ applydim! (v -> $ op! (α, v), y, d, 1 )
66
78
end
67
79
68
- function $op_dim_end! (α, d:: Number , y:: AbstractArray{<:Any,N} ) where N
80
+ function $op_dim_end! (α, d:: Number , y:: AbstractArray )
69
81
# scale just the d-th dimension by permuting it to the first
70
- ỹ = PermutedDimsArray (y, _permfirst (d, N ))
71
- $ op! (α, view (ỹ, size (ỹ, 1 ), ntuple (_ -> :, Val (N - 1 )) ... ))
82
+ d ∈ 1 : ndims (y) || throw ( ArgumentError ( " dimension $d must lie between 1 and $( ndims (y)) " ))
83
+ applydim! (v -> $ op! (α, v), y, d, size (y, d ))
72
84
end
73
85
end
74
86
end
@@ -363,35 +375,34 @@ function plan_chebyshevutransform(x::AbstractArray{T,N}, ::Val{2}, dims...; kws.
363
375
ChebyshevUTransformPlan {T,2} (FFTW. plan_r2r (x, USECONDKIND, dims... ; kws... ))
364
376
end
365
377
366
-
367
- _permfirst (d, N) = [d; 1 : d- 1 ; d+ 1 : N]
368
-
369
- @inline function _chebu1_prescale! (d:: Number , X:: AbstractArray{T,N} ) where {T,N}
370
- X̃ = PermutedDimsArray (X, _permfirst (d, N))
371
- m = size (X̃,1 )
372
- X̃ .= (sinpi .(one (T)/ (2 m) .+ ((1 : m) .- one (T))/ m) ./ m) .* X̃
373
- X
374
- end
375
-
376
- @inline function _chebu1_prescale! (d, y:: AbstractArray )
377
- for k in d
378
- _chebu1_prescale! (k, y)
378
+ for f in [:_chebu1_prescale! , :_chebu1_postscale! , :_chebu2_prescale! , :_chebu2_postscale! ,
379
+ :_ichebu1_postscale! ]
380
+ _f = Symbol (:_ , f)
381
+ @eval begin
382
+ @inline function $f (d:: Number , X:: AbstractArray )
383
+ d ∈ 1 : ndims (X) || throw (" dimension $d must lie between 1 and $(ndims (X)) " )
384
+ $ _f (d, X)
385
+ X
386
+ end
387
+ @inline function $f (d, y:: AbstractArray )
388
+ for k in d
389
+ $ f (k, y)
390
+ end
391
+ y
392
+ end
379
393
end
380
- y
381
394
end
382
395
383
- @inline function _chebu1_postscale! (d:: Number , X:: AbstractArray{T,N} ) where {T,N}
384
- X̃ = PermutedDimsArray (X, _permfirst (d, N))
385
- m = size (X̃,1 )
386
- X̃ .= X̃ ./ (sinpi .(one (T)/ (2 m) .+ ((1 : m) .- one (T))/ m) ./ m)
387
- X
396
+ function __chebu1_prescale! (d:: Number , X:: AbstractArray{T} ) where {T}
397
+ m = size (X,d)
398
+ r = one (T)/ (2 m) .+ ((1 : m) .- one (T)). / m
399
+ applydim! (v -> v .*= sinpi .(r) ./ m, X, d, :)
388
400
end
389
401
390
- @inline function _chebu1_postscale! (d, y:: AbstractArray )
391
- for k in d
392
- _chebu1_postscale! (k, y)
393
- end
394
- y
402
+ @inline function __chebu1_postscale! (d:: Number , X:: AbstractArray{T} ) where {T}
403
+ m = size (X,d)
404
+ r = one (T)/ (2 m) .+ ((1 : m) .- one (T)). / m
405
+ applydim! (v -> v ./= sinpi .(r) ./ m, X, d, :)
395
406
end
396
407
397
408
function * (P:: ChebyshevUTransformPlan{T,1,K,true,N} , x:: AbstractArray{T,N} ) where {T,K,N}
@@ -413,35 +424,18 @@ function mul!(y::AbstractArray{T}, P::ChebyshevUTransformPlan{T,1,K,false}, x::A
413
424
end
414
425
415
426
416
- @inline function _chebu2_prescale! (d:: Number , X:: AbstractArray{T,N} ) where {T,N}
417
- X̃ = PermutedDimsArray (X, _permfirst (d, N))
418
- m = size (X̃,1 )
427
+ @inline function __chebu2_prescale! (d, X:: AbstractArray{T} ) where {T}
428
+ m = size (X,d)
419
429
c = one (T)/ (m+ 1 )
420
- X̃ . = sinpi .(( 1 : m) .* c) .* X̃
421
- X
430
+ r = ( 1 : m) .* c
431
+ applydim! (v -> v .*= sinpi .(r), X, d, :)
422
432
end
423
433
424
- @inline function _chebu2_prescale! (d, y:: AbstractArray )
425
- for k in d
426
- _chebu2_prescale! (k, y)
427
- end
428
- y
429
- end
430
-
431
-
432
- @inline function _chebu2_postscale! (d:: Number , X:: AbstractArray{T,N} ) where {T,N}
433
- X̃ = PermutedDimsArray (X, _permfirst (d, N))
434
- m = size (X̃,1 )
434
+ @inline function __chebu2_postscale! (d:: Number , X:: AbstractArray{T} ) where {T}
435
+ m = size (X,d)
435
436
c = one (T)/ (m+ 1 )
436
- X̃ .= X̃ ./ sinpi .((1 : m) .* c)
437
- X
438
- end
439
-
440
- @inline function _chebu2_postscale! (d, y:: AbstractArray )
441
- for k in d
442
- _chebu2_postscale! (k, y)
443
- end
444
- y
437
+ r = (1 : m) .* c
438
+ applydim! (v -> v ./= sinpi .(r), X, d, :)
445
439
end
446
440
447
441
function * (P:: ChebyshevUTransformPlan{T,2,K,true,N} , x:: AbstractArray{T,N} ) where {T,K,N}
@@ -525,19 +519,10 @@ inv(P::IChebyshevUTransformPlan{T,2}) where {T} = ChebyshevUTransformPlan{T,2}(P
525
519
inv (P:: ChebyshevUTransformPlan{T,1} ) where {T} = IChebyshevUTransformPlan {T,1} (inv (P. plan). p)
526
520
inv (P:: IChebyshevUTransformPlan{T,1} ) where {T} = ChebyshevUTransformPlan {T,1} (inv (P. plan). p)
527
521
528
- @inline function _ichebu1_postscale! (d:: Number , X:: AbstractArray{T,N} ) where {T,N}
529
- X̃ = PermutedDimsArray (X, _permfirst (d, N))
530
- m = size (X̃,1 )
531
- X̃ .= X̃ ./ (2 .* sinpi .(one (T)/ (2 m) .+ ((1 : m) .- one (T))/ m))
532
- X
533
- end
534
-
535
-
536
- @inline function _ichebu1_postscale! (d, y:: AbstractArray )
537
- for k in d
538
- _ichebu1_postscale! (k, y)
539
- end
540
- y
522
+ @inline function __ichebu1_postscale! (d:: Number , X:: AbstractArray{T} ) where {T}
523
+ m = size (X,d)
524
+ r = one (T)/ (2 m) .+ ((1 : m) .- one (T))/ m
525
+ applydim! (v -> v ./= 2 .* sinpi .(r), X, d, :)
541
526
end
542
527
543
528
function * (P:: IChebyshevUTransformPlan{T,1,K,true} , x:: AbstractArray{T} ) where {T<: fftwNumber ,K}
0 commit comments