@@ -31,7 +31,7 @@ function *(P::ArrayPlan, f::AbstractArray)
31
31
perm = [d; setdiff (1 : ndims (f), d)]
32
32
fp = permutedims (f, perm)
33
33
34
- fr = reshape (fp, size (fp,1 ), prod ( size (fp)[ 2 : end ]) )
34
+ fr = reshape (fp, size (fp,1 ), : )
35
35
36
36
permutedims (reshape (F* fr, size (fp)... ), inv_perm (perm))
37
37
end
@@ -45,33 +45,39 @@ function \(P::ArrayPlan, f::AbstractArray)
45
45
perm = [d; setdiff (1 : ndims (f), d)]
46
46
fp = permutedims (f, perm)
47
47
48
- fr = reshape (fp, size (fp,1 ), prod ( size (fp)[ 2 : end ]) )
48
+ fr = reshape (fp, size (fp,1 ), : )
49
49
50
50
permutedims (reshape (F\ fr, size (fp)... ), inv_perm (perm))
51
51
end
52
52
53
- struct NDimsPlan{T, FF<: ArrayPlan{<:T} , Dims<: Tuple } <: Plan{T}
53
+ struct NDimsPlan{T, FF<: ArrayPlan{<:T} , Szs <: Tuple , Dims<: Tuple } <: Plan{T}
54
54
F:: FF
55
+ szs:: Szs
55
56
dims:: Dims
56
- function NDimsPlan (F, dims)
57
- if length (Set (size (F, dims... ) )) > 1
57
+ function NDimsPlan (F, szs, dims)
58
+ if length (Set (szs[[ dims... ]] )) > 1
58
59
error (" Different size in dims axes not yet implemented in N-dimensional transform." )
59
60
end
60
- new {eltype(F), typeof(F), typeof(dims)} (F, dims)
61
+ new {eltype(F), typeof(F), typeof(szs), typeof( dims)} (F, szs , dims)
61
62
end
62
63
end
63
64
64
- size (P:: NDimsPlan ) = size (P. F)
65
- size (P:: NDimsPlan , k:: Int ) = size (P. F, k)
66
- size (P:: NDimsPlan , k... ) = size (P. F, k... )
65
+ size (P:: NDimsPlan ) = P. szs
66
+ size (P:: NDimsPlan , k:: Int ) = P. szs[k]
67
+ size (P:: NDimsPlan , k... ) = P. szs[[k... ]]
68
+
69
+ function NDimsPlan (F:: FTPlan , szs:: Tuple , dims:: Tuple )
70
+ NDimsPlan (ArrayPlan (F, szs, (first (dims),)), szs, dims)
71
+ end
67
72
68
73
function * (P:: NDimsPlan , f:: AbstractArray )
69
74
F, dims = P. F, P. dims
70
- @assert size (F ) == size (f)
75
+ @assert size (P ) == size (f)
71
76
g = copy (f)
72
77
t = 1 : ndims (g)
78
+ d1 = dims[1 ]
73
79
for d in dims
74
- perm = ntuple (k -> k == 1 ? t[d] : k == d ? t[1 ] : t[k], ndims (g))
80
+ perm = ntuple (k -> k == d1 ? t[d] : k == d ? t[d1 ] : t[k], ndims (g))
75
81
gp = permutedims (g, perm)
76
82
g = permutedims (F* gp, inv_perm (perm))
77
83
end
80
86
81
87
function \ (P:: NDimsPlan , f:: AbstractArray )
82
88
F, dims = P. F, P. dims
83
- @assert size (F ) == size (f)
89
+ @assert size (P ) == size (f)
84
90
g = copy (f)
85
91
t = 1 : ndims (g)
92
+ d1 = dims[1 ]
86
93
for d in dims
87
- perm = ntuple (k -> k == 1 ? t[d] : k == d ? t[1 ] : t[k], ndims (g))
94
+ perm = ntuple (k -> k == d1 ? t[d] : k == d ? t[d1 ] : t[k], ndims (g))
88
95
gp = permutedims (g, perm)
89
96
g = permutedims (F\ gp, inv_perm (perm))
90
97
end
0 commit comments