1 #ifndef NPSTAT_FILLARRAYCENTERSPRESERVINGAREAS_HH_
2 #define NPSTAT_FILLARRAYCENTERSPRESERVINGAREAS_HH_
28 template <
typename Num1,
unsigned StackLen1,
unsigned StackDim1,
29 typename Num2,
unsigned StackLen2,
unsigned StackDim2>
36 throw std::invalid_argument(
37 "In npstat::fillArrayCentersPreservingAreas:"
38 " uninitialized array");
39 const unsigned dim = from.
rank();
40 if (dim != to->
rank())
throw std::invalid_argument(
41 "In npstat::fillArrayCentersPreservingAreas:"
42 " incompatible array ranks");
43 const unsigned* toShape = to->
shapeData();
44 const unsigned* fromShape = from.
shapeData();
45 unsigned factors[CHAR_BIT*
sizeof(
unsigned long)];
46 double areaFactor = 1.0;
47 for (
unsigned idim=0; idim<dim; ++idim)
49 factors[idim] = toShape[idim]/fromShape[idim];
50 if (toShape[idim] % fromShape[idim])
throw std::invalid_argument(
51 "In npstat::fillArrayCentersPreservingAreas:"
52 " array dimensions are not exact multiples");
53 if (factors[idim] % 2U)
54 areaFactor *= factors[idim];
56 areaFactor *= (factors[idim]/2.0);
58 const Num2 zero = Num2();
59 const unsigned long toLen = to->
length();
60 unsigned toIndex[CHAR_BIT*
sizeof(
unsigned long)];
61 unsigned fromIndex[CHAR_BIT*
sizeof(
unsigned long)];
62 for (
unsigned long i=0; i<toLen; ++i)
68 for (
unsigned idim=0; idim<dim && central; ++idim)
70 fromIndex[idim] = toIndex[idim]/factors[idim];
71 const unsigned rem = toIndex[idim] % factors[idim];
72 const unsigned half = factors[idim]/2U;
73 if (factors[idim] % 2U)
74 central = rem == half;
76 central = rem == half || rem == half - 1U;
90 template <
typename Num1,
unsigned StackLen1,
unsigned StackDim1,
91 typename Num2,
unsigned StackLen2,
unsigned StackDim2>
98 const unsigned dim = from.
rank();
101 const unsigned* toShape = to.
shapeData();
102 const unsigned* fromShape = from.
shapeData();
103 for (
unsigned idim=0; idim<dim; ++idim)
104 if (toShape[idim] % fromShape[idim])
Arbitrary-dimensional array template.
Definition: ArrayND.hh:93
void convertLinearIndex(unsigned long l, unsigned *index, unsigned indexLen) const
unsigned rank() const
Definition: ArrayND.hh:329
unsigned long length() const
Definition: ArrayND.hh:320
Numeric & linearValue(unsigned long index)
bool isShapeKnown() const
Definition: ArrayND.hh:326
Numeric & value(const unsigned *index, unsigned indexLen)
const unsigned * shapeData() const
Definition: ArrayND.hh:335
Definition: AbsArrayProjector.hh:14
bool canFillArrayCentersPreservingAreas(const ArrayND< Num1, StackLen1, StackDim1 > &from, const ArrayND< Num2, StackLen2, StackDim2 > &to)
Definition: fillArrayCentersPreservingAreas.hh:92
void fillArrayCentersPreservingAreas(const ArrayND< Num1, StackLen1, StackDim1 > &from, ArrayND< Num2, StackLen2, StackDim2 > *to)
Definition: fillArrayCentersPreservingAreas.hh:30