@@ -6,6 +6,9 @@ For best performance, choose the right number of threads by `FFTW.set_num_thread
6
6
immutable iNUFFTPlan{N,T,S,PT} <: Base.DFT.Plan{T}
7
7
pt:: PT
8
8
TP:: Toeplitz{T}
9
+ r:: Vector{T}
10
+ p:: Vector{T}
11
+ Ap:: Vector{T}
9
12
ϵ:: S
10
13
end
11
14
@@ -22,8 +25,11 @@ function plan_inufft1{T<:AbstractFloat}(ω::AbstractVector{T}, ϵ::T)
22
25
r[1 ] = avg
23
26
c[1 ] = avg
24
27
TP = Toeplitz (c, r)
28
+ r = zero (c)
29
+ p = zero (c)
30
+ Ap = zero (c)
25
31
26
- iNUFFTPlan {1, eltype(TP), typeof(ϵ), typeof(pt)} (pt, TP, ϵ)
32
+ iNUFFTPlan {1, eltype(TP), typeof(ϵ), typeof(pt)} (pt, TP, r, p, Ap, ϵ)
27
33
end
28
34
29
35
doc"""
@@ -38,23 +44,26 @@ function plan_inufft2{T<:AbstractFloat}(x::AbstractVector{T}, ϵ::T)
38
44
r[1 ] = avg
39
45
c[1 ] = avg
40
46
TP = Toeplitz (c, r)
47
+ r = zero (c)
48
+ p = zero (c)
49
+ Ap = zero (c)
41
50
42
- iNUFFTPlan {2, eltype(TP), typeof(ϵ), typeof(pt)} (pt, TP, ϵ)
51
+ iNUFFTPlan {2, eltype(TP), typeof(ϵ), typeof(pt)} (pt, TP, r, p, Ap, ϵ)
43
52
end
44
53
45
54
function (* ){N,T,V}(p:: iNUFFTPlan{N,T} , x:: AbstractVector{V} )
46
55
A_mul_B! (zeros (promote_type (T,V), length (x)), p, x)
47
56
end
48
57
49
58
function Base. A_mul_B! {T} (c:: AbstractVector{T} , P:: iNUFFTPlan{1,T} , f:: AbstractVector{T} )
50
- pt, TP, ϵ = P. pt, P. TP, P. ϵ
51
- cg (TP, c, f, 50 , 100 ϵ)
59
+ pt, TP, r, p, Ap, ϵ = P. pt, P. TP, P . r, P . p, P . Ap , P. ϵ
60
+ cg_for_inufft (TP, c, f, r, p, Ap , 50 , 100 ϵ)
52
61
conj! (A_mul_B! (c, pt, conj! (c)))
53
62
end
54
63
55
64
function Base. A_mul_B! {T} (c:: AbstractVector{T} , P:: iNUFFTPlan{2,T} , f:: AbstractVector{T} )
56
- pt, TP, ϵ = P. pt, P. TP, P. ϵ
57
- cg (TP, c, conj! (pt* conj! (f)), 50 , 100 ϵ)
65
+ pt, TP, r, p, Ap, ϵ = P. pt, P. TP, P . r, P . p, P . Ap , P. ϵ
66
+ cg_for_inufft (TP, c, conj! (pt* conj! (f)), r, p, Ap , 50 , 100 ϵ)
58
67
conj! (f)
59
68
c
60
69
end
@@ -69,16 +78,16 @@ Computes an inverse nonuniform fast Fourier transform of type II.
69
78
"""
70
79
inufft2 {T<:AbstractFloat} (c:: AbstractVector , x:: AbstractVector{T} , ϵ:: T ) = plan_inufft2 (x, ϵ)* c
71
80
72
- function cg {T} (A:: ToeplitzMatrices.AbstractToeplitz{T} , x:: AbstractVector{T} , b:: AbstractVector{T} , max_it:: Integer , tol:: Real )
81
+ function cg_for_inufft {T} (A:: ToeplitzMatrices.AbstractToeplitz{T} , x:: AbstractVector{T} , b:: AbstractVector{T} , r :: AbstractVector{T} , p :: AbstractVector{T} , Ap :: AbstractVector{T} , max_it:: Integer , tol:: Real )
73
82
n = length (b)
74
83
n1, n2 = size (A)
75
84
n == n1 == n2 || throw (DimensionMismatch (" " ))
76
85
nrmb = norm (b)
77
86
if nrmb == 0 nrmb = one (typeof (nrmb)) end
78
87
copy! (x, b)
79
- r = zero (x )
80
- p = zero (x )
81
- Ap = zero (x )
88
+ fill! (r, zero (T) )
89
+ fill! (p, zero (T) )
90
+ fill! (Ap, zero (T) )
82
91
# r = b - A*x
83
92
copy! (r, b)
84
93
A_mul_B! (- one (T), A, x, one (T), r)
0 commit comments