30#ifdef BOOST_NO_STDC_NAMESPACE
45inline Array<1, elemT>&
49 v[i] = std::log(v[i]);
53template <
int num_dimensions,
class elemT>
54inline Array<num_dimensions, elemT>&
63inline Array<1, elemT>&
67 v[i] = std::exp(v[i]);
71template <
int num_dimensions,
class elemT>
72inline Array<num_dimensions, elemT>&
81inline Array<1, elemT>&
90template <
int num_dimensions,
class elemT>
91inline Array<num_dimensions, elemT>&
99template <
class T,
class FUNCTION>
103 typename T::full_iterator iter = v.begin_all();
104 const typename T::full_iterator end_iter = v.end_all();
105 while (iter != end_iter)
113template <
int num_dim,
typename elemT,
typename FunctionObjectPtr>
117 assert(array.is_regular());
118 const int outer_min_index = array.get_min_index();
119 const int outer_max_index = array.get_max_index();
127 full_iterators(outer_min_index, outer_max_index);
128 for (
int i = outer_min_index; i <= outer_max_index; ++i)
129 full_iterators[i] = array[i].begin_all();
134 while (full_iterators[outer_min_index] != array[outer_min_index].end_all())
137 for (
int i = outer_min_index; i <= outer_max_index; ++i)
138 array1d[i] = *full_iterators[i];
145 for (
int i = outer_min_index; i <= outer_max_index; ++i)
146 *full_iterators[i]++ = array1d[i];
150template <
int num_dim,
typename elemT,
typename FunctionObjectPtr>
163 for (
int i = in_min_index; i <= in_max_index; ++i)
164 in_full_iterators[i] = in_array[i].begin_all();
167 for (
int i = out_min_index; i <= out_max_index; ++i)
168 out_full_iterators[i] = out_array[i].begin_all();
174 while (in_full_iterators[in_min_index] != in_array[in_min_index].end_all())
176 assert(out_full_iterators[out_min_index] != out_array[out_min_index].end_all());
179 for (
int i = in_min_index; i <= in_max_index; ++i)
180 in_array1d[i] = *(in_full_iterators[i]++);
183 (*f)(out_array1d, in_array1d);
184 assert(out_array1d.get_min_index() == out_min_index);
185 assert(out_array1d.get_max_index() == out_max_index);
189 for (
int i = out_min_index; i <= out_max_index; ++i)
190 *(out_full_iterators[i]++) = out_array1d[i];
192 assert(out_full_iterators[out_min_index] == out_array[out_min_index].end_all());
195template <
int num_dim,
typename elemT,
typename FunctionObjectPtrIter>
198 FunctionObjectPtrIter start,
199 FunctionObjectPtrIter stop)
201 assert(start + num_dim == stop);
206 for (
typename Array<num_dim, elemT>::iterator restiter = array.begin(); restiter != array.end(); ++restiter)
210template <
typename elemT,
typename FunctionObjectPtrIter>
214 assert(start + 1 == stop);
218template <
int num_dim,
typename elemT,
typename FunctionObjectPtrIter>
222 FunctionObjectPtrIter start,
223 FunctionObjectPtrIter stop)
225 assert(start + num_dim == stop);
242template <
int num_dim,
typename elemT>
246 ActualFunctionObjectPtrIter start,
247 ActualFunctionObjectPtrIter stop)
249 assert(start + num_dim == stop);
253 if ((**start).is_trivial())
265 if ((**start).get_influencing_indices(influencing_indices,
276 tmp_out_min_indices[1] = influencing_indices.
get_min_index();
277 tmp_out_max_indices[1] = influencing_indices.
get_max_index();
288template <
typename elemT>
292 ActualFunctionObjectPtrIter start,
293 ActualFunctionObjectPtrIter stop)
295 assert(start + 1 == stop);
296 (**start)(out_array, in_array);
299template <
typename elemT,
typename FunctionObjectPtrIter>
303 FunctionObjectPtrIter start,
304 FunctionObjectPtrIter stop)
306 assert(start + 1 == stop);
307 (**start)(out_array, in_array);
312template <
int num_dimensions,
typename elemT>
314transform_array_to_periodic_indices(Array<num_dimensions, elemT>& out_array,
const Array<num_dimensions, elemT>& in_array)
316 assert(norm(get_min_indices(out_array)) < .01);
318 BasicCoordinate<num_dimensions, int> min_indices, max_indices;
320 assert(out_array.get_regular_range(min_indices, max_indices));
321 out_array.get_regular_range(min_indices, max_indices);
322 const BasicCoordinate<num_dimensions, int> out_sizes = max_indices - min_indices + 1;
324 BasicCoordinate<num_dimensions, int> index = get_min_indices(in_array);
327 out_array[modulo(index, out_sizes)] = in_array[index];
328 }
while (
next(index, in_array));
332template <
int num_dimensions,
typename elemT>
334transform_array_from_periodic_indices(Array<num_dimensions, elemT>& out_array,
const Array<num_dimensions, elemT>& in_array)
338 BasicCoordinate<num_dimensions, int> min_indices, max_indices;
340 assert(in_array.get_regular_range(min_indices, max_indices));
341 in_array.get_regular_range(min_indices, max_indices);
342 const BasicCoordinate<num_dimensions, int> in_sizes = max_indices - min_indices + 1;
344 BasicCoordinate<num_dimensions, int> index =
get_min_indices(out_array);
347 out_array[index] = in_array[
modulo(index, in_sizes)];
348 }
while (
next(index, out_array));
This file declares class stir::BasicCoordinate and some functions acting on stir::BasicCoordinate obj...
a variety of useful functions for indexing stir::Array objects
This class defines multi-dimensional (numeric) arrays.
Definition Array.h:78
bool get_regular_range(BasicCoordinate< num_dimensions, int > &min, BasicCoordinate< num_dimensions, int > &max) const
find regular range, returns false if the range is not regular
Definition Array.inl:477
bool is_regular() const
checks if the index range is 'regular'
Definition Array.inl:469
class BasicCoordinate<int num_dimensions, typename coordT> defines num_dimensions -dimensional coordi...
Definition BasicCoordinate.h:57
This class defines ranges which can be 'irregular'.
Definition IndexRange.h:69
A templated class for vectors, but with indices starting not from 0.
Definition VectorWithOffset.h:65
int get_max_index() const
get value of last valid index
Definition VectorWithOffset.inl:131
int get_min_index() const
get value of first valid index
Definition VectorWithOffset.inl:124
Array< 1, elemT > & in_place_abs(Array< 1, elemT > &v)
Replace elements by their absolute value, 1D version.
Definition ArrayFunction.inl:82
void in_place_apply_array_function_on_1st_index(Array< num_dim, elemT > &array, FunctionObjectPtr f)
Apply a function object on all possible 1d arrays extracted by keeping all indices fixed,...
Definition ArrayFunction.inl:115
T & in_place_apply_function(T &v, FUNCTION f)
apply any function(object) to each element of the multi-dimensional array
Definition ArrayFunction.inl:101
void apply_array_function_on_1st_index(Array< num_dim, elemT > &out_array, const Array< num_dim, elemT > &in_array, FunctionObjectPtr f)
apply any function(object) to each element of the multi-dimensional array, storing results in a diffe...
Definition ArrayFunction.inl:152
void in_place_apply_array_functions_on_each_index(Array< num_dim, elemT > &array, FunctionObjectPtrIter start, FunctionObjectPtrIter stop)
Apply a sequence of 1d array-function objects on every dimension of the input array.
Definition ArrayFunction.inl:197
void apply_array_functions_on_each_index(Array< num_dim, elemT > &out_array, const Array< num_dim, elemT > &in_array, FunctionObjectPtrIter start, FunctionObjectPtrIter stop)
Apply a sequence of 1d array-function objects on every dimension of the input array,...
Definition ArrayFunction.inl:220
Array< 1, elemT > & in_place_exp(Array< 1, elemT > &v)
Replace elements by their exponentiation, 1D version.
Definition ArrayFunction.inl:64
Array< 1, elemT > & in_place_log(Array< 1, elemT > &v)
Replace elements by their logarithm, 1D version.
Definition ArrayFunction.inl:46
double norm(const BasicCoordinate< num_dimensions, coordT > &p1)
compute sqrt(inner_product(p1,p1))
Definition BasicCoordinate.inl:426
defines stir::modulo() and related functions
BasicCoordinate< num_dimensions, int > get_min_indices(const Array< num_dimensions, T > &a)
Get the first multi-dimensional index of the array.
Definition array_index_functions.inl:100
bool next(BasicCoordinate< num_dimensions, int > &indices, const Array< num_dimensions2, T > &a)
Given an index into an array, increment it to the next one.
Definition array_index_functions.inl:107
double modulo(const double a, const double b)
Like std::fmod() but with guaranteed nonnegative result.
Definition modulo.h:52