31#ifdef BOOST_NO_STDC_NAMESPACE
46inline Array<1, elemT>&
50 v[i] = std::log(v[i]);
54template <
int num_dimensions,
class elemT>
55inline Array<num_dimensions, elemT>&
64inline Array<1, elemT>&
68 v[i] = std::exp(v[i]);
72template <
int num_dimensions,
class elemT>
73inline Array<num_dimensions, elemT>&
82inline Array<1, elemT>&
91template <
int num_dimensions,
class elemT>
92inline Array<num_dimensions, elemT>&
100template <
class T,
class FUNCTION>
104 typename T::full_iterator iter = v.begin_all();
105 const typename T::full_iterator end_iter = v.end_all();
106 while (iter != end_iter)
114template <
int num_dim,
typename elemT,
typename FunctionObjectPtr>
118 assert(array.is_regular());
119 const int outer_min_index = array.get_min_index();
120 const int outer_max_index = array.get_max_index();
128 full_iterators(outer_min_index, outer_max_index);
129 for (
int i = outer_min_index; i <= outer_max_index; ++i)
130 full_iterators[i] = array[i].begin_all();
135 while (full_iterators[outer_min_index] != array[outer_min_index].end_all())
138 for (
int i = outer_min_index; i <= outer_max_index; ++i)
139 array1d[i] = *full_iterators[i];
146 for (
int i = outer_min_index; i <= outer_max_index; ++i)
147 *full_iterators[i]++ = array1d[i];
151template <
int num_dim,
typename elemT,
typename FunctionObjectPtr>
164 for (
int i = in_min_index; i <= in_max_index; ++i)
165 in_full_iterators[i] = in_array[i].begin_all();
168 for (
int i = out_min_index; i <= out_max_index; ++i)
169 out_full_iterators[i] = out_array[i].begin_all();
175 while (in_full_iterators[in_min_index] != in_array[in_min_index].end_all())
177 assert(out_full_iterators[out_min_index] != out_array[out_min_index].end_all());
180 for (
int i = in_min_index; i <= in_max_index; ++i)
181 in_array1d[i] = *(in_full_iterators[i]++);
184 (*f)(out_array1d, in_array1d);
185 assert(out_array1d.get_min_index() == out_min_index);
186 assert(out_array1d.get_max_index() == out_max_index);
190 for (
int i = out_min_index; i <= out_max_index; ++i)
191 *(out_full_iterators[i]++) = out_array1d[i];
193 assert(out_full_iterators[out_min_index] == out_array[out_min_index].end_all());
196template <
int num_dim,
typename elemT,
typename FunctionObjectPtrIter>
199 FunctionObjectPtrIter start,
200 FunctionObjectPtrIter stop)
202 assert(start + num_dim == stop);
207 for (
typename Array<num_dim, elemT>::iterator restiter = array.begin(); restiter != array.end(); ++restiter)
211template <
typename elemT,
typename FunctionObjectPtrIter>
215 assert(start + 1 == stop);
219template <
int num_dim,
typename elemT,
typename FunctionObjectPtrIter>
223 FunctionObjectPtrIter start,
224 FunctionObjectPtrIter stop)
226 assert(start + num_dim == stop);
243template <
int num_dim,
typename elemT>
247 ActualFunctionObjectPtrIter start,
248 ActualFunctionObjectPtrIter stop)
250 assert(start + num_dim == stop);
254 if ((**start).is_trivial())
266 if ((**start).get_influencing_indices(influencing_indices,
277 tmp_out_min_indices[1] = influencing_indices.
get_min_index();
278 tmp_out_max_indices[1] = influencing_indices.
get_max_index();
289template <
typename elemT>
293 ActualFunctionObjectPtrIter start,
294 ActualFunctionObjectPtrIter stop)
296 assert(start + 1 == stop);
297 (**start)(out_array, in_array);
300template <
typename elemT,
typename FunctionObjectPtrIter>
304 FunctionObjectPtrIter start,
305 FunctionObjectPtrIter stop)
307 assert(start + 1 == stop);
308 (**start)(out_array, in_array);
313template <
int num_dimensions,
typename elemT>
315transform_array_to_periodic_indices(Array<num_dimensions, elemT>& out_array,
const Array<num_dimensions, elemT>& in_array)
317 assert(norm(get_min_indices(out_array)) < .01);
319 BasicCoordinate<num_dimensions, int> min_indices, max_indices;
321 assert(out_array.get_regular_range(min_indices, max_indices));
322 out_array.get_regular_range(min_indices, max_indices);
323 const BasicCoordinate<num_dimensions, int> out_sizes = max_indices - min_indices + 1;
325 BasicCoordinate<num_dimensions, int> index = get_min_indices(in_array);
328 out_array[modulo(index, out_sizes)] = in_array[index];
329 }
while (
next(index, in_array));
333template <
int num_dimensions,
typename elemT>
335transform_array_from_periodic_indices(Array<num_dimensions, elemT>& out_array,
const Array<num_dimensions, elemT>& in_array)
339 BasicCoordinate<num_dimensions, int> min_indices, max_indices;
341 assert(in_array.get_regular_range(min_indices, max_indices));
342 in_array.get_regular_range(min_indices, max_indices);
343 const BasicCoordinate<num_dimensions, int> in_sizes = max_indices - min_indices + 1;
345 BasicCoordinate<num_dimensions, int> index =
get_min_indices(out_array);
348 out_array[index] = in_array[
modulo(index, in_sizes)];
349 }
while (
next(index, out_array));
352template <
typename InputIt,
typename elemT>
354find_unique_values(std::set<elemT>& values, InputIt begin, InputIt end)
356 for (
auto iter = begin; iter != end; ++iter)
357 values.insert(*iter);
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 is_regular() const
checks if the index range is 'regular'
Definition Array.inl:469
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
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:83
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:116
T & in_place_apply_function(T &v, FUNCTION f)
apply any function(object) to each element of the multi-dimensional array
Definition ArrayFunction.inl:102
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:153
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:198
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:221
Array< 1, elemT > & in_place_exp(Array< 1, elemT > &v)
Replace elements by their exponentiation, 1D version.
Definition ArrayFunction.inl:65
Array< 1, elemT > & in_place_log(Array< 1, elemT > &v)
Replace elements by their logarithm, 1D version.
Definition ArrayFunction.inl:47
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