@@ -6,6 +6,9 @@ For best performance, choose the right number of threads by `FFTW.set_num_thread
66immutable iNUFFTPlan{N,T,S,PT} <: Base.DFT.Plan{T}
77 pt:: PT
88 TP:: Toeplitz{T}
9+ r:: Vector{T}
10+ p:: Vector{T}
11+ Ap:: Vector{T}
912 ϵ:: S
1013end
1114
@@ -22,8 +25,11 @@ function plan_inufft1{T<:AbstractFloat}(ω::AbstractVector{T}, ϵ::T)
2225 r[1 ] = avg
2326 c[1 ] = avg
2427 TP = Toeplitz (c, r)
28+ r = zero (c)
29+ p = zero (c)
30+ Ap = zero (c)
2531
26- iNUFFTPlan {1, eltype(TP), typeof(ϵ), typeof(pt)} (pt, TP, ϵ)
32+ iNUFFTPlan {1, eltype(TP), typeof(ϵ), typeof(pt)} (pt, TP, r, p, Ap, ϵ)
2733end
2834
2935doc"""
@@ -38,23 +44,26 @@ function plan_inufft2{T<:AbstractFloat}(x::AbstractVector{T}, ϵ::T)
3844 r[1 ] = avg
3945 c[1 ] = avg
4046 TP = Toeplitz (c, r)
47+ r = zero (c)
48+ p = zero (c)
49+ Ap = zero (c)
4150
42- iNUFFTPlan {2, eltype(TP), typeof(ϵ), typeof(pt)} (pt, TP, ϵ)
51+ iNUFFTPlan {2, eltype(TP), typeof(ϵ), typeof(pt)} (pt, TP, r, p, Ap, ϵ)
4352end
4453
4554function (* ){N,T,V}(p:: iNUFFTPlan{N,T} , x:: AbstractVector{V} )
4655 A_mul_B! (zeros (promote_type (T,V), length (x)), p, x)
4756end
4857
4958function 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 ϵ)
5261 conj! (A_mul_B! (c, pt, conj! (c)))
5362end
5463
5564function 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 ϵ)
5867 conj! (f)
5968 c
6069end
@@ -69,16 +78,16 @@ Computes an inverse nonuniform fast Fourier transform of type II.
6978"""
7079inufft2 {T<:AbstractFloat} (c:: AbstractVector , x:: AbstractVector{T} , ϵ:: T ) = plan_inufft2 (x, ϵ)* c
7180
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 )
7382 n = length (b)
7483 n1, n2 = size (A)
7584 n == n1 == n2 || throw (DimensionMismatch (" " ))
7685 nrmb = norm (b)
7786 if nrmb == 0 nrmb = one (typeof (nrmb)) end
7887 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) )
8291 # r = b - A*x
8392 copy! (r, b)
8493 A_mul_B! (- one (T), A, x, one (T), r)
0 commit comments