1 #ifndef MHO_NDArrayMath_HH__
2 #define MHO_NDArrayMath_HH__
32 static std::size_t
Modulus(std::size_t arg, std::size_t n) {
return arg % n; }
46 template< std::
size_t RANK >
49 std::size_t val = Index[0];
50 for(std::size_t i = 1; i < RANK; i++)
70 template< std::
size_t RANK >
74 for(std::size_t i = 0; i < RANK; i++)
76 val += Index[i] * Strides[i];
94 template< std::
size_t RANK >
98 for(std::size_t i = 0; i < RANK; i++)
120 template< std::
size_t RANK >
123 std::size_t div[RANK];
127 for(std::size_t d = 0; d < RANK; d++)
134 div[i] = (offset - Index[i]) / DimSize[i];
139 div[i] = (div[i + 1] - Index[i]) / DimSize[i];
153 template< std::
size_t RANK >
inline static bool CheckIndexValidity(
const std::size_t* DimSize,
const std::size_t* Index)
155 for(std::size_t i = 0; i < RANK; i++)
157 if(Index[i] >= DimSize[i])
173 template< std::
size_t RANK >
inline static std::size_t
TotalArraySize(
const std::size_t* DimSize)
176 for(std::size_t i = 0; i < RANK; i++)
197 template<
int numerator,
int denominator >
struct Divide
213 template< std::
size_t RANK >
216 std::size_t total_array_size = MHO_NDArrayMath::TotalArraySize< RANK >(DimSize);
217 std::size_t index[RANK];
218 for(std::size_t i = 0; i < total_array_size; i++)
220 MHO_NDArrayMath::RowMajorIndexFromOffset< RANK >(i, DimSize, index);
221 for(std::size_t j = 0; j < RANK; j++)
223 index[j] = (DimSize[j] - index[j]) % DimSize[j];
225 ReversedIndex[i] = MHO_NDArrayMath::OffsetFromRowMajorIndex< RANK >(DimSize, index);
237 template< std::
size_t RANK >
static bool IncrementIndices(
const std::size_t* DimSize, std::size_t* Index)
239 for(std::size_t i = 1; i <= RANK; i++)
241 if(++Index[RANK - i] < DimSize[RANK - i])
264 template< std::
size_t RANK >
265 static bool IncrementIndices(
const std::size_t* DimSize, std::size_t* Index, std::size_t diff)
267 std::size_t offset = OffsetFromRowMajorIndex< RANK >(DimSize, Index);
269 if(offset < TotalArraySize< RANK >(DimSize))
271 RowMajorIndexFromOffset< RANK >(offset, DimSize, Index);
286 template< std::
size_t RANK >
static bool DecrementIndices(
const std::size_t* DimSize, std::size_t* Index)
288 for(std::size_t i = 1; i <= RANK; i++)
290 if(Index[RANK - i] > 0)
297 Index[RANK - i] = DimSize[RANK - i] - 1;
314 template< std::
size_t RANK >
315 static bool DecrementIndices(
const std::size_t* DimSize, std::size_t* Index, std::size_t diff)
317 std::size_t offset = OffsetFromRowMajorIndex< RANK >(DimSize, Index);
321 RowMajorIndexFromOffset< RANK >(offset, DimSize, Index);
utility functions for multidimensional array access
Definition: MHO_NDArrayMath.hh:19
static bool DecrementIndices(const std::size_t *DimSize, std::size_t *Index)
Decrements indices in a multidimensional by one, array using row major indexing.
Definition: MHO_NDArrayMath.hh:286
static std::size_t Modulus(std::size_t arg, std::size_t n)
Calculates the modulus of two integers.
Definition: MHO_NDArrayMath.hh:32
static void RowMajorIndexFromOffset(std::size_t offset, const std::size_t *DimSize, std::size_t *Index)
Function RowMajorIndexFromOffset.
Definition: MHO_NDArrayMath.hh:121
static bool CheckIndexValidity(const std::size_t *DimSize, const std::size_t *Index)
Checks if all indices in Index are within valid range for a multidimensional array.
Definition: MHO_NDArrayMath.hh:153
MHO_NDArrayMath()
Definition: MHO_NDArrayMath.hh:21
static std::size_t StrideFromRowMajorIndex(std::size_t selected_dim, const std::size_t *DimSize)
Calculates stride for a given dimension in a row-major indexed multidimensional array.
Definition: MHO_NDArrayMath.hh:95
static bool IncrementIndices(const std::size_t *DimSize, std::size_t *Index)
Increment multi-dimensional indices by one in row-major order, accounting for roll-over.
Definition: MHO_NDArrayMath.hh:237
static std::size_t OffsetFromRowMajorIndex(const std::size_t *DimSize, const std::size_t *Index)
Calculates offset into a multidimensional array using row-major indexing.
Definition: MHO_NDArrayMath.hh:47
static void OffsetsForReversedIndices(const std::size_t *DimSize, std::size_t *ReversedIndex)
Calculates reversed indices offsets for the given dimensions.
Definition: MHO_NDArrayMath.hh:214
static std::size_t OffsetFromStrideIndex(const std::size_t *Strides, const std::size_t *Index)
Calculates offset for a given index into a multidimensional array using row-major indexing/strides.
Definition: MHO_NDArrayMath.hh:71
static bool DecrementIndices(const std::size_t *DimSize, std::size_t *Index, std::size_t diff)
Decrements indices in a multidimensional array by amount specified in diff, or until an underflow is ...
Definition: MHO_NDArrayMath.hh:315
virtual ~MHO_NDArrayMath()
Definition: MHO_NDArrayMath.hh:22
static bool IncrementIndices(const std::size_t *DimSize, std::size_t *Index, std::size_t diff)
Increment multi-dimensional indices by the amount in diff (accounting for roll-over) and return true ...
Definition: MHO_NDArrayMath.hh:265
static std::size_t TotalArraySize(const std::size_t *DimSize)
Calculates total size of an array given its dimensions.
Definition: MHO_NDArrayMath.hh:173
Definition: MHO_ChannelLabeler.hh:17
enum Divide - compute integer division at compile time
Definition: MHO_NDArrayMath.hh:198
enum PowerOfTwo - compute 2^N at compile time
Definition: MHO_NDArrayMath.hh:187