8
8
AbstractNFFTs. size_in (p:: NDFTPlan ) = p. N
9
9
AbstractNFFTs. size_out (p:: NDFTPlan ) = (p. M,)
10
10
11
+ mutable struct NDCTPlan{T,D} <: AbstractNFCTPlan{T,D,1}
12
+ N:: NTuple{D,Int64}
13
+ M:: Int64
14
+ x:: Matrix{T}
15
+ end
16
+
17
+ AbstractNFFTs. size_in (p:: NDCTPlan ) = p. N
18
+ AbstractNFFTs. size_out (p:: NDCTPlan ) = (p. M,)
19
+
11
20
mutable struct NNDFTPlan{T} <: AbstractNNFFTPlan{T,1,1}
12
21
N:: Int64
13
22
M:: Int64
@@ -31,6 +40,17 @@ function NDFTPlan(x::Matrix{T}, N::NTuple{D,Int}; kwargs...) where {T,D}
31
40
return NDFTPlan {T,D} (N, M, x)
32
41
end
33
42
43
+ function NDCTPlan (x:: Matrix{T} , N:: NTuple{D,Int} ; kwargs... ) where {T,D}
44
+
45
+ if D != size (x,1 )
46
+ throw (ArgumentError (" Nodes x have dimension $(size (x,1 )) != $D " ))
47
+ end
48
+
49
+ M = size (x, 2 )
50
+
51
+ return NDCTPlan {T,D} (N, M, x)
52
+ end
53
+
34
54
function NNDFTPlan (x:: Matrix{T} , y:: Matrix{T} ; kwargs... ) where {T}
35
55
36
56
M = size (x, 2 )
@@ -47,6 +67,13 @@ ndft(x::AbstractArray, f::AbstractArray; kargs...) =
47
67
ndft_adjoint (x, N, fHat:: AbstractVector ; kargs... ) =
48
68
adjoint (NDFTPlan (x, N; kargs... )) * fHat
49
69
70
+ ndct (x:: AbstractArray , f:: AbstractArray ; kargs... ) =
71
+ NDCTPlan (x, size (f); kargs... ) * f
72
+
73
+ ndct_transposed (x, N, fHat:: AbstractVector ; kargs... ) =
74
+ transpose (NDCTPlan (x, N; kargs... )) * fHat
75
+
76
+
50
77
51
78
52
79
function LinearAlgebra. mul! (g:: AbstractArray{Tg} , plan:: NDFTPlan{Tp,D} , f:: AbstractArray{T,D} ) where {D,Tp,T,Tg}
@@ -99,7 +126,55 @@ function LinearAlgebra.mul!(g::AbstractArray{Tg,D}, pl::Adjoint{Complex{Tp},<:ND
99
126
return g
100
127
end
101
128
129
+ function LinearAlgebra. mul! (g:: AbstractArray{Tg} , plan:: NDCTPlan{Tp,D} , f:: AbstractArray{T,D} ) where {D,Tp,T,Tg}
130
+
131
+ plan. N == size (f) ||
132
+ throw (DimensionMismatch (" Data f is not consistent with NDFTPlan" ))
133
+ plan. M == length (g) ||
134
+ throw (DimensionMismatch (" Output g is inconsistent with NDFTPlan" ))
135
+
136
+ g .= zero (Tg)
137
+
138
+ for l= 1 : prod (plan. N)
139
+ idx = CartesianIndices (plan. N)[l]
140
+
141
+ for k= 1 : plan. M
142
+ arg = one (T)
143
+ for d= 1 : D
144
+ arg *= cos ( 2 * pi * plan. x[d,k] * ( idx[d] - 1 ) )
145
+ end
146
+ g[k] += f[l] * arg
147
+ end
148
+ end
149
+
150
+ return g
151
+ end
152
+
153
+
154
+ function LinearAlgebra. mul! (g:: AbstractArray{Tg,D} , pl:: Transpose{Tp,<:NDCTPlan{Tp,D}} , fHat:: AbstractVector{T} ) where {D,Tp,T,Tg}
155
+ p = pl. parent
102
156
157
+ p. M == length (fHat) ||
158
+ throw (DimensionMismatch (" Data f inconsistent with NDFTPlan" ))
159
+ p. N == size (g) ||
160
+ throw (DimensionMismatch (" Output g inconsistent with NDFTPlan" ))
161
+
162
+ g .= zero (Tg)
163
+
164
+ for l= 1 : prod (p. N)
165
+ idx = CartesianIndices (p. N)[l]
166
+
167
+ for k= 1 : p. M
168
+ arg = one (T)
169
+ for d= 1 : D
170
+ arg *= cos ( 2 * pi * plan. x[d,k] * ( idx[d] - 1 ) )
171
+ end
172
+ g[l] += fHat[k] * arg
173
+ end
174
+ end
175
+
176
+ return g
177
+ end
103
178
104
179
105
180
function LinearAlgebra. mul! (g:: AbstractArray{Tg} , plan:: NNDFTPlan{Tp} , f:: AbstractArray{T} ) where {Tp,T,Tg}
0 commit comments