11export select_region_ft, select_region_rft
22export rft_fix_after, rft_fix_before, ft_fix_after, ft_fix_before
33
4-
54"""
65 select_region_ft(mat,new_size)
76
@@ -62,12 +61,12 @@ julia> select_region_ft(ffts(x), (5,3))
6261 -86.75+0.0im 165.5+0.0im -86.75+0.0im
6362```
6463"""
65- function select_region_ft (mat,new_size)
64+ function select_region_ft (mat, new_size)
6665 old_size = size (mat)
67- mat_fixed_before = ft_fix_before (mat,old_size,new_size)
68- mat_pad = ft_pad (mat_fixed_before,new_size)
66+ mat_fixed_before = ft_fix_before (mat, old_size, new_size)
67+ mat_pad = ft_pad (mat_fixed_before, new_size)
6968 # afterwards we add the highest pos. frequency to the highest lowest one
70- return ft_fix_after (mat_pad ,old_size,new_size)
69+ return ft_fix_after (mat_pad ,old_size, new_size)
7170end
7271
7372"""
@@ -87,12 +86,11 @@ The size of the corresponding real-space array before it was rfted.
8786The size of the corresponding real-space array view after the operation finished. The Fourier-center
8887is always assumed to align before and after the padding aperation.
8988"""
90- function select_region_rft (mat,old_size, new_size)
91- rft_old_size = size (mat)
92- rft_new_size = Base. setindex (new_size,new_size[1 ]÷ 2 + 1 , 1 )
89+ function select_region_rft (mat, old_size, new_size)
90+ # rft_old_size = size(mat)
91+ rft_new_size = Base. setindex (new_size,new_size[1 ] ÷ 2 + 1 , 1 )
9392 return rft_fix_after (rft_pad (
94- rft_fix_before (mat,old_size,new_size),
95- rft_new_size),old_size,new_size)
93+ rft_fix_before (mat, old_size, new_size), rft_new_size), old_size, new_size)
9694end
9795
9896"""
@@ -123,75 +121,112 @@ julia> select_region(ones(3,3),new_size=(7,7),center=(1,3))
123121"""
124122function select_region (mat; new_size= size (mat), center= ft_center_diff (size (mat)).+ 1 , pad_value= zero (eltype (mat)))
125123 new_size = Tuple (expand_size (new_size, size (mat)))
126- center = Tuple (expand_size (center, ft_center_diff (size (mat)).+ 1 ))
127- oldcenter = ft_center_diff (new_size).+ 1
128- PaddedView (pad_value, mat,new_size, oldcenter .- center.+ 1 );
124+ center = Tuple (expand_size (center, ft_center_diff (size (mat)) .+ 1 ))
125+ oldcenter = ft_center_diff (new_size) .+ 1
126+ PaddedView (pad_value, mat, new_size, oldcenter .- center.+ 1 );
129127end
130128
131129function ft_pad (mat, new_size)
132- return select_region (mat;new_size= new_size)
130+ return select_region (mat; new_size = new_size)
133131end
134132
135133function rft_pad (mat, new_size)
136134 c2 = rft_center_diff (size (mat))
137- c2 = Base. setindex (c2, new_size[1 ]. ÷ 2 , 1 );
138- return select_region (mat;new_size= new_size, center= c2 .+ 1 )
135+ c2 = Base. setindex (c2, new_size[1 ] .÷ 2 , 1 );
136+ return select_region (mat; new_size= new_size, center = c2 .+ 1 )
139137end
140138
141- function ft_fix_before (mat, size_old, size_new; start_dim= 1 )
142- for d = start_dim: ndims (mat)
143- sn = size_new[d]
144- so = size_old[d]
145- if sn < so && iseven (sn)
146- L1 = (size_old[d] - size_new[d] )÷ 2 + 1
147- mat = FourierJoin (mat, d, L1)
148- end
149- end
150- return mat
139+ """
140+ ft_fix_before(mat::MT, size_old, size_new, ::Val{N})::FourierJoin{T,N,MT} where {T,N, MT<:AbstractArray{T,N}}
141+
142+ implements the specialized (highest dimension) version of a recursive dimension-specific function that returns an array type which knows
143+ how to access (joins) certain elements.
144+ """
145+ function ft_fix_before (mat:: MT , size_old, size_new, :: Val{N} ):: FourierJoin{T,N,MT} where {T,N, MT<: AbstractArray{T,N} }
146+ sn = size_new[N]
147+ so = size_old[N]
148+ do_join = (sn < so && iseven (sn))
149+ L1 = (size_old[N] - size_new[N] ) ÷ 2 + 1
150+ return FourierJoin (mat, N, L1, do_join)
151151end
152152
153- function ft_fix_after (mat,size_old,size_new; start_dim= 1 )
154- start_dim
155- ndims (mat)
156- for d= start_dim: ndims (mat)
157- sn = size_new[d]
158- so = size_old[d]
159- if sn > so && iseven (so)
160- L1 = (size_new[d]- size_old[d])÷ 2 + 1
161- mat = FourierSplit (mat,d,L1)
162- end
163- # if equal do nothing
153+ """
154+ ft_fix_before(mat::MT, size_old, size_new, ::Val{D}=Val(1)) where {D, T, N, MT<:AbstractArray{T,N}}
155+
156+ implements the general version of a recursive dimension-specific function that returns an array type which knows
157+ how to access (joins) certain elements.
158+ """
159+ function ft_fix_before (mat:: MT , size_old, size_new, :: Val{D} = Val (1 )) where {D, T, N, MT<: AbstractArray{T,N} }
160+ if D <= N
161+ sn = size_new[D]
162+ so = size_old[D]
163+ do_join = (sn < so && iseven (sn))
164+ L1 = (size_old[D] - size_new[D] )÷ 2 + 1
165+ mat = FourierJoin (mat, D, L1, do_join)
166+ return ft_fix_before (mat, size_old, size_new, Val (D + 1 ))
167+ else
168+ L1 = (size_old[N] - size_new[N] )÷ 2 + 1
169+ return FourierJoin (mat, N, L1, false )
164170 end
165- return mat
166171end
167172
168- function rft_fix_first_dim_before (mat,size_old,size_new;dim= 1 )
169- sn = size_new[dim] # Note that this dim is the corresponding real-space size
170- so = size_old[dim] # Note that this dim is the corresponding real-space size
171- if sn < so && iseven (sn) # result size is even upon cropping
172- L1 = size_new[dim] ÷ 2 + 1
173- mat = FourierJoin (mat, dim, L1, L1) # a hack to dublicate the value
173+ function ft_fix_after (mat:: MT , size_old, size_new, :: Val{N} ):: FourierSplit{T,N,MT} where {T, N, MT<: AbstractArray{T,N} }
174+ sn = size_new[N]
175+ so = size_old[N]
176+ do_split = (sn > so && iseven (so))
177+ L1 = (size_new[N] - size_old[N]) ÷ 2 + 1
178+ return FourierSplit (mat, N, L1, do_split)
179+ end
180+
181+ function ft_fix_after (mat:: MT , size_old, size_new, :: Val{D} = Val (1 )) where {D, T, N, MT<: AbstractArray{T,N} }
182+ if D <= N
183+ sn = size_new[D]
184+ so = size_old[D]
185+ do_split = (sn > so && iseven (so))
186+ L1 = (size_new[D]- size_old[D])÷ 2 + 1
187+ mat = FourierSplit (mat, D, L1, do_split)
188+ return ft_fix_after (mat, size_old, size_new, Val (D + 1 ))
189+ else
190+ L1 = (size_new[N]- size_old[N])÷ 2 + 1
191+ return FourierSplit (mat, N, L1, false )
174192 end
193+ end
194+
195+ function rft_fix_first_dim_before (mat, size_old, size_new; dim= 1 )
196+ # Note that this dim is the corresponding real-space size
197+ sn = size_new[dim]
198+ so = size_old[dim]
199+ # result size is even upon cropping
200+ do_join = (sn < so && iseven (sn))
201+ L1 = size_new[dim] ÷ 2 + 1
202+ # a hack to dublicate the value
203+ mat = FourierJoin (mat, dim, L1, L1, do_join)
175204 return mat
176205end
177206
178207function rft_fix_first_dim_after (mat,size_old,size_new;dim= 1 )
179- sn = size_new[dim] # Note that this dim is the corresponding real-space size
180- so = size_old[dim] # Note that this dim is the corresponding real-space size
181- if sn > so && iseven (so) # source size is even upon padding
182- L1 = size_old[dim] ÷ 2 + 1
183- mat = FourierSplit (mat,dim,L1,- 1 ) # This hack prevents a second position to be affected
184- end
208+ # Note that this dim is the corresponding real-space size
209+ sn = size_new[dim]
210+ so = size_old[dim]
211+ # source size is even upon padding
212+ do_split = (sn > so && iseven (so))
213+ L1 = size_old[dim] ÷ 2 + 1
214+ # This hack prevents a second position to be affected
215+ mat = FourierSplit (mat, dim, L1, - 1 , do_split)
185216 # if equal do nothing
186217 return mat
187218end
188219
189220function rft_fix_before (mat,size_old,size_new)
190- mat= rft_fix_first_dim_before (mat,size_old,size_new;dim= 1 ) # ignore the first dimension
191- ft_fix_before (mat,size_old,size_new;start_dim= 2 ) # ignore the first dimension
221+ # ignore the first dimension
222+ mat= rft_fix_first_dim_before (mat,size_old,size_new;dim= 1 )
223+ # ignore the first dimension since it starts at Val(2)
224+ ft_fix_before (mat, size_old, size_new, Val (2 ))
192225end
193226
194227function rft_fix_after (mat,size_old,size_new)
195- mat = rft_fix_first_dim_after (mat,size_old,size_new;dim= 1 ) # ignore the first dimension
196- ft_fix_after (mat,size_old,size_new;start_dim= 2 ) # ignore the first dimension
228+ # ignore the first dimension
229+ mat = rft_fix_first_dim_after (mat,size_old,size_new;dim= 1 )
230+ # ignore the first dimension since it starts at Val(2)
231+ ft_fix_after (mat, size_old, size_new, Val (2 ))
197232end
0 commit comments