28 #ifndef CASA_MARRAYMATH_H 29 #define CASA_MARRAYMATH_H 32 #include <casacore/casa/aips.h> 33 #include <casacore/tables/TaQL/MArray.h> 34 #include <casacore/tables/TaQL/MArrayMathBase.h> 35 #include <casacore/casa/Arrays/ArrayPartMath.h> 36 #include <casacore/casa/Arrays/ArrayIter.h> 95 template<
typename T>
class MSumFunc :
public MArrayFunctorBase<T> {
100 template<
typename T>
class MSumSqrFunc :
public MArrayFunctorBase<T> {
103 T operator() (
const MArray<T>& arr)
const {
return sumsqr(arr); }
105 template<
typename T>
class MProductFunc :
public MArrayFunctorBase<T> {
110 template<
typename T>
class MMinFunc :
public MArrayFunctorBase<T> {
115 template<
typename T>
class MMaxFunc :
public MArrayFunctorBase<T> {
120 template<
typename T>
class MMeanFunc :
public MArrayFunctorBase<T> {
130 template<
typename T>
class MStddevFunc :
public MArrayFunctorBase<T> {
135 template<
typename T>
class MAvdevFunc :
public MArrayFunctorBase<T> {
140 template<
typename T>
class MRmsFunc :
public MArrayFunctorBase<T> {
145 template<
typename T>
class MMedianFunc :
public MArrayFunctorBase<T> {
149 : itsSorted(sorted), itsTakeEvenMean(takeEvenMean), itsInPlace(inPlace) {}
152 {
return median(arr, itsSorted, itsTakeEvenMean, itsInPlace); }
162 : itsFraction(fraction), itsSorted(sorted), itsInPlace(inPlace) {}
165 {
return fractile(arr, itsFraction, itsSorted, itsInPlace); }
178 const MArrayFunctorBase<T>& funcObj)
181 partialArrayMath (res, a, collapseAxes, funcObj);
184 template<
typename T,
typename RES>
188 const MArrayFunctorBase<T,RES>& funcObj)
220 RES* data = res.
array().data();
222 while (!aiter.pastEnd()) {
223 if (allTrue(miter.array())) {
228 *data++ = funcObj(
MArray<T> (aiter.array(), miter.array()));
241 const MArrayFunctorBase<T>& funcObj)
247 template<
typename T,
typename RES>
251 const MArrayFunctorBase<T,RES>& funcObj)
260 RES* data = res.
array().data();
267 if (allTrue(subMask)) {
275 for (ax=0; ax<
ndim; ++ax) {
276 blc[ax] += fullBoxShape[ax];
277 if (blc[ax] < shape[ax]) {
278 trc[ax] += fullBoxShape[ax];
279 if (trc[ax] >= shape[ax]) {
280 trc[ax] = shape[ax]-1;
285 trc[ax] = fullBoxShape[ax]-1;
294 template <
typename T>
297 const MArrayFunctorBase<T>& funcObj,
304 template <
typename T,
typename RES>
308 const MArrayFunctorBase<T,RES>& funcObj,
329 resa.reference (resa(boxEnd2, resShape+boxEnd2-1));
330 resm.reference (resm(boxEnd2, resShape+boxEnd2-1));
340 if (allTrue(subMask)) {
350 for (ax=0; ax<
ndim; ++ax) {
351 if (++pos[ax] < resShape[ax]) {
358 trc[ax] = boxEnd[ax];
701 accumulateMasked<T>(a.
array().cbegin(), a.
array().cend(),
703 accumulateMasked<T>(a.
array().begin(), a.
array().end(),
714 accumulateMasked<T>(a.
array().cbegin(), a.
array().cend(),
716 accumulateMasked<T>(a.
array().begin(), a.
array().end(),
719 return sumsqr(a.
array());
727 accumulateMasked<T>(a.
array().cbegin(), a.
array().cend(),
729 accumulateMasked<T>(a.
array().begin(), a.
array().end(),
740 accumulateMasked<T>(a.
array().cbegin(), a.
array().cend(),
742 accumulateMasked<T>(a.
array().begin(), a.
array().end(),
753 accumulateMasked<T>(a.
array().cbegin(), a.
array().cend(),
755 accumulateMasked<T>(a.
array().begin(), a.
array().end(),
765 if (nv == 0)
return T();
767 return T(
sum(a) / (1.0*nv));
774 if (nv < 2)
return T();
777 accumulateMasked<T>(a.
array().cbegin(), a.
array().cend(),
779 accumulateMasked<T>(a.
array().begin(), a.
array().end(),
781 return T(sum / (1.0*nv - 1));
806 if (nv == 0)
return T();
809 accumulateMasked<T>(a.
array().cbegin(), a.
array().cend(),
811 accumulateMasked<T>(a.
array().begin(), a.
array().end(),
813 return T(sum / (1.0*nv));
826 if (nv == 0)
return T();
829 accumulateMasked<T>(a.
array().cbegin(), a.
array().cend(),
831 accumulateMasked<T>(a.
array().begin(), a.
array().end(),
833 return T(
sqrt(sum / (1.0*nv)));
841 if (a.
empty())
return T();
845 if (nv == 0)
return T();
848 return median (arr, sorted, takeEvenMean,
True);
870 if (a.
empty())
return T();
874 if (nv == 0)
return T();
891 return partialArrayMath (a, collapseAxes,
MSumFunc<T>());
925 return partialArrayMath (a, collapseAxes,
MMinFunc<T>());
936 return partialArrayMath (a, collapseAxes,
MMaxFunc<T>());
947 return partialArrayMath (a, collapseAxes,
MMeanFunc<T>());
991 return partialArrayMath (a, collapseAxes,
MRmsFunc<T>());
1003 takeEvenMean, inPlace));
1005 return partialArrayMath (a, collapseAxes,
1008 template<
typename T>
1018 fraction, inPlace));
1020 return partialArrayMath (a, collapseAxes,
1027 template<
typename T>
1035 SumFunc<T>(), fillEdge));
1039 template<
typename T>
1047 SumSqrFunc<T>(), fillEdge));
1051 template<
typename T>
1059 ProductFunc<T>(), fillEdge));
1063 template<
typename T>
1071 MinFunc<T>(), fillEdge));
1075 template<
typename T>
1083 MaxFunc<T>(), fillEdge));
1087 template<
typename T>
1095 MeanFunc<T>(), fillEdge));
1099 template<
typename T>
1107 VarianceFunc<T>(), fillEdge));
1111 template<
typename T>
1119 StddevFunc<T>(), fillEdge));
1123 template<
typename T>
1131 AvdevFunc<T>(), fillEdge));
1135 template<
typename T>
1143 RmsFunc<T>(), fillEdge));
1147 template<
typename T>
1158 MedianFunc<T>(
False, takeEvenMean,
1166 template<
typename T>
1177 FractileFunc<T>(fraction,
False,
1189 template<
typename T>
1200 template<
typename T>
1211 template<
typename T>
1222 template<
typename T>
1233 template<
typename T>
1244 template<
typename T>
1255 template<
typename T>
1266 template<
typename T>
1277 template<
typename T>
1288 template<
typename T>
1299 template<
typename T>
1309 MedianFunc<T>(
False, takeEvenMean,
1315 template<
typename T>
1325 FractileFunc<T>(fraction,
False,
T stddev(const MArray< T > &a)
MArray< T > slidingRmss(const MArray< T > &a, const IPosition &halfBoxSize, Bool fillEdge=True)
A Vector of integers, for indexing into Array<T> objects.
LatticeExprNode log10(const LatticeExprNode &expr)
void setMask(const Array< Bool > &mask)
Set the mask.
Bool isNull() const
Is the array null?
MArray< T > exp(const MArray< T > &a)
MArray< T > slidingVariances(const MArray< T > &a, const IPosition &halfBoxSize, Bool fillEdge=True)
long long Int64
Define the extra non-standard types used by Casacore (like proposed uSize, Size)
Class to handle an Array with an optional mask.
MArray< T > partialAvdevs(const MArray< T > &a, const IPosition &collapseAxes)
LatticeExprNode log(const LatticeExprNode &expr)
void boxedArrayMath(MArray< RES > &res, const MArray< T > &array, const IPosition &boxShape, const MArrayFunctorBase< T, RES > &funcObj)
MArray< Double > phase(const MArray< DComplex > &arr)
MArray< T > boxedMaxs(const MArray< T > &a, const IPosition &boxSize)
LatticeExprNode median(const LatticeExprNode &expr)
MArray< T > partialMins(const MArray< T > &a, const IPosition &collapseAxes)
MArray< T > sin(const MArray< T > &a)
Perform mathematical function on each element in an array.
MArray< T > fmod(const T &left, const MArray< T > &right)
Functor to add square of right to left.
Functor to add absolute diff of right and base value to left.
MArray< T > partialMaxs(const MArray< T > &a, const IPosition &collapseAxes)
LatticeExprNode operator/(const LatticeExprNode &left, const LatticeExprNode &right)
MArray< Float > imag(const MArray< Complex > &arr)
LatticeExprNode mask(const LatticeExprNode &expr)
This function returns the mask of the given expression.
T product(const TableVector< T > &tv)
MArray< T > slidingArrayMath(const MArray< T > &array, const IPosition &halfBoxShape, const MArrayFunctorBase< T > &funcObj, Bool fillEdge=True)
LatticeExprNode imag(const LatticeExprNode &expr)
Array< Bool > combineMask(const MArrayBase &other) const
Combine this and the other mask.
MArray< T > boxedFractiles(const MArray< T > &a, const IPosition &boxSize, Float fraction, Bool inPlace=False)
MFractileFunc(Float fraction, Bool sorted=False, Bool inPlace=False)
void partialArrayMath(MArray< RES > &res, const MArray< T > &a, const IPosition &collapseAxes, const MArrayFunctorBase< T, RES > &funcObj)
MArray< T > atan2(const MArray< T > &left, const MArray< T > &right)
MArray< T > sinh(const MArray< T > &a)
MArray< T > tanh(const MArray< T > &a)
TableExprNode array(const TableExprNode &values, const TableExprNodeSet &shape)
Create an array of the given shape and fill it with the values.
LatticeExprNode sum(const LatticeExprNode &expr)
LatticeExprNode max(const LatticeExprNode &left, const LatticeExprNode &right)
LatticeExprNode operator%(const LatticeExprNode &left, const LatticeExprNode &right)
Functor to get maximum of two values.
MArray< T > slidingMedians(const MArray< T > &a, const IPosition &halfBoxSize, Bool takeEvenMean=False, Bool inPlace=False, Bool fillEdge=True)
TableExprNode phase(const TableExprNode &node)
The phase (i.e.
Vector< T > flatten() const
Flatten the unmasked elements of the array to a vector.
MArray< T > atan2(const MArray< T > &left, const T &right)
MArray< T > partialSumSqrs(const MArray< T > &a, const IPosition &collapseAxes)
T median(const MArray< T > &a, Bool sorted)
T variance(const MArray< T > &a, T mean)
MArray< T > pow(const MArray< T > &a, const MArray< T > &exp)
MArray< T > boxedMeans(const MArray< T > &a, const IPosition &boxSize)
LatticeExprNode fractile(const LatticeExprNode &expr, const LatticeExprNode &fraction)
Determine the value of the element at the part fraction from the beginning of the given lattice...
MArray< T > partialFractiles(const MArray< T > &a, const IPosition &collapseAxes, Float fraction, Bool inPlace=False)
T medianInPlace(const MArray< T > &a, Bool sorted=False)
T stddev(const MArray< T > &a, T mean)
T avdev(const MArray< T > &a, T mean)
MArray< T > asin(const MArray< T > &a)
LatticeExprNode exp(const LatticeExprNode &expr)
iterator begin()
Get the begin iterator object for any array.
MArray< T > acos(const MArray< T > &a)
T sum(const MArray< T > &a)
Reduce an array to a scalar using the unmasked elements only.
MArray< T > boxedMedians(const MArray< T > &a, const IPosition &boxSize, Bool takeEvenMean=False, Bool inPlace=False)
MArray< T > slidingProducts(const MArray< T > &a, const IPosition &halfBoxSize, Bool fillEdge=True)
MArray< Float > phase(const MArray< Complex > &arr)
MArray< T > floor(const MArray< T > &a)
LatticeExprNode floor(const LatticeExprNode &expr)
void fillBoxedShape(const IPosition &shape, const IPosition &boxShape, IPosition &fullBoxShape, IPosition &resultShape)
Helper functions for boxed and sliding functions.
MArray< T > boxedProducts(const MArray< T > &a, const IPosition &boxSize)
MArray< T > min(const MArray< T > &left, const T &right)
Define functors to perform a reduction function on an MArray object.
const ssize_t * storage() const
Get the storage.
MArray< T > partialProducts(const MArray< T > &a, const IPosition &collapseAxes)
T sumsqr(const MArray< T > &a)
MArray< T > slidingFractiles(const MArray< T > &a, const IPosition &halfBoxSize, Float fraction, Bool inPlace=False, Bool fillEdge=True)
LatticeExprNode cos(const LatticeExprNode &expr)
contiter cbegin()
Get the begin iterator object for a contiguous array.
T median(const MArray< T > &a, Bool sorted, Bool takeEvenMean, Bool inPlace=False)
MArray< T > max(const MArray< T > &left, const MArray< T > &right)
const Array< Bool > & mask() const
Get the mask.
MArray< T > fmod(const MArray< T > &left, const MArray< T > &right)
MArray< Float > amplitude(const MArray< Complex > &arr)
void slidingArrayMath(MArray< RES > &res, const MArray< T > &array, const IPosition &halfBoxShape, const MArrayFunctorBase< T, RES > &funcObj, Bool fillEdge=True)
MArray< T > partialArrayMath(const MArray< T > &a, const IPosition &collapseAxes, const MArrayFunctorBase< T > &funcObj)
Do partial reduction of an MArray object.
T * data()
Get a pointer to the beginning of the array.
Functor to get minimum of two values.
LatticeExprNode conj(const LatticeExprNode &expr)
T max(const MArray< T > &a)
Int64 nvalid() const
Return the number of valid array values, thus unflagged elements.
Float pow(Float f1, Float f2)
MArray< T > tan(const MArray< T > &a)
T fractile(const MArray< T > &a, Float fraction, Bool sorted=False, Bool inPlace=False)
Return the fractile of an array.
LatticeExprNode tanh(const LatticeExprNode &expr)
T variance(const MArray< T > &a)
LatticeExprNode min(const LatticeExprNode &left, const LatticeExprNode &right)
LatticeExprNode avdev(const LatticeExprNode &expr)
MArray< T > slidingMaxs(const MArray< T > &a, const IPosition &halfBoxSize, Bool fillEdge=True)
Bool contiguousStorage() const
Are the array data contiguous? If they are not contiguous, getStorage (see below) needs to make a cop...
const Array< T > & array() const
Get access to the array.
MArray< T > cube(const MArray< T > &a)
MArray< T > partialRmss(const MArray< T > &a, const IPosition &collapseAxes)
MArray< T > floormod(const T &left, const MArray< T > &right)
LatticeExprNode abs(const LatticeExprNode &expr)
Numerical 1-argument functions which result in a real number regardless of input expression type...
MArray< T > abs(const MArray< T > &a)
MArray< T > min(const T &left, const MArray< T > &right)
LatticeExprNode ndim(const LatticeExprNode &expr)
1-argument function to get the dimensionality of a lattice.
T median(const MArray< T > &a)
Bool fillSlidingShape(const IPosition &shape, const IPosition &halfBoxSize, IPosition &boxEnd, IPosition &resultShape)
Determine the box end and shape of result for a sliding operation.
MArray< T > sign(const MArray< T > &a)
LatticeExprNode sign(const LatticeExprNode &expr)
LatticeExprNode sqrt(const LatticeExprNode &expr)
MArray< T > min(const MArray< T > &left, const MArray< T > &right)
MArray< T > log10(const MArray< T > &a)
LatticeExprNode tan(const LatticeExprNode &expr)
MArray< T > slidingAvdevs(const MArray< T > &a, const IPosition &halfBoxSize, Bool fillEdge=True)
LatticeExprNode atan(const LatticeExprNode &expr)
#define AlwaysAssert(expr, exception)
These marcos are provided for use instead of simply using the constructors of assert_ to allow additi...
T rms(const MArray< T > &a)
bool Bool
Define the standard types used by Casacore.
T product(const MArray< T > &a)
MArray< T > boxedAvdevs(const MArray< T > &a, const IPosition &boxSize)
MaskedArray< T > boxedArrayMath(const MaskedArray< T > &array, const IPosition &boxSize, const FuncType &funcObj)
Apply the given ArrayMath reduction function objects to each box in the array.
MArray< T > partialVariances(const MArray< T > &a, const IPosition &collapseAxes)
TableExprNode cube(const TableExprNode &node)
LatticeExprNode stddev(const LatticeExprNode &expr)
MArray< T > atan(const MArray< T > &a)
MArray< T > cos(const MArray< T > &a)
LatticeExprNode round(const LatticeExprNode &expr)
MArray< T > boxedSumSqrs(const MArray< T > &a, const IPosition &boxSize)
MArray< T > cosh(const MArray< T > &a)
Iterate a const Array cursor through a const Array.
MArray< T > boxedArrayMath(const MArray< T > &a, const IPosition &boxShape, const MArrayFunctorBase< T > &funcObj)
TableExprNode shape(const TableExprNode &array)
Function operating on any scalar or array resulting in a Double array containing the shape...
size_t size() const
Get the size.
void resize(const IPosition &shape, Bool useMask)
Resize the array and optionally the mask.
MArray< T > slidingMins(const MArray< T > &a, const IPosition &halfBoxSize, Bool fillEdge=True)
TableExprNode operator|(const TableExprNode &left, const TableExprNode &right)
LatticeExprNode atan2(const LatticeExprNode &left, const LatticeExprNode &right)
Numerical 2-argument functions.
MArray< T > round(const MArray< T > &a)
MArray< T > boxedRmss(const MArray< T > &a, const IPosition &boxSize)
MArray< T > partialMedians(const MArray< T > &a, const IPosition &collapseAxes, Bool takeEvenMean=False, Bool inPlace=False)
T min(const MArray< T > &a)
MArray< T > slidingSumSqrs(const MArray< T > &a, const IPosition &halfBoxSize, Bool fillEdge=True)
MArray< T > conj(const MArray< T > &arr)
LatticeExprNode operator+(const LatticeExprNode &expr)
Global functions operating on a LatticeExprNode.
MArray< T > floormod(const MArray< T > &left, const MArray< T > &right)
LatticeExprNode fmod(const LatticeExprNode &left, const LatticeExprNode &right)
MArray< T > boxedStddevs(const MArray< T > &a, const IPosition &boxSize)
Bool empty() const
Is the array empty?
MArray< T > boxedVariances(const MArray< T > &a, const IPosition &boxSize)
Base class for all Casacore library errors.
LatticeExprNode asin(const LatticeExprNode &expr)
const IPosition & shape() const
Get the shape.
Share means that the Array will just use the pointer (no copy), however the Array will NOT delete it ...
LatticeExprNode mean(const LatticeExprNode &expr)
MArray< T > partialSums(const MArray< T > &a, const IPosition &collapseAxes)
Get partial sums, etc.
TableExprNode rms(const TableExprNode &array)
LatticeExprNode sinh(const LatticeExprNode &expr)
MArray< Double > amplitude(const MArray< DComplex > &arr)
MArray< T > partialStddevs(const MArray< T > &a, const IPosition &collapseAxes)
Bool hasMask() const
Is there a mask?
LatticeExprNode acos(const LatticeExprNode &expr)
TableExprNode square(const TableExprNode &node)
MArray< T > atan2(const T &left, const MArray< T > &right)
Array< T > slidingArrayMath(const MaskedArray< T > &array, const IPosition &halfBoxSize, const FuncType &funcObj, Bool fillEdge=True)
Apply for each element in the array the given ArrayMath reduction function object to the box around t...
LatticeExprNode operator-(const LatticeExprNode &expr)
MArray< T > ceil(const MArray< T > &a)
MArray< T > boxedSums(const MArray< T > &a, const IPosition &boxSize)
Get boxed sums.
MArray< T > max(const MArray< T > &left, const T &right)
MArray< T > fmod(const MArray< T > &left, const T &right)
MArray< T > max(const T &left, const MArray< T > &right)
MArray< T > slidingMeans(const MArray< T > &a, const IPosition &halfBoxSize, Bool fillEdge=True)
LatticeExprNode operator^(const LatticeExprNode &left, const LatticeExprNode &right)
TableExprNode operator &(const TableExprNode &left, const TableExprNode &right)
MArray< T > log(const MArray< T > &a)
MArray< T > partialMeans(const MArray< T > &a, const IPosition &collapseAxes)
MArray< T > sqrt(const MArray< T > &a)
LatticeExprNode variance(const LatticeExprNode &expr)
LatticeExprNode ceil(const LatticeExprNode &expr)
MArray< T > pow(const T &a, const MArray< T > &exp)
MArray< Double > real(const MArray< DComplex > &arr)
MArray< Float > real(const MArray< Complex > &arr)
MArray< T > floormod(const MArray< T > &left, const T &right)
MArray< T > square(const MArray< T > &a)
T mean(const MArray< T > &a)
this file contains all the compiler specific defines
MVBaseline operator*(const RotMatrix &left, const MVBaseline &right)
Rotate a Baseline vector with rotation matrix and other multiplications.
LatticeExprNode cosh(const LatticeExprNode &expr)
MArray< Double > imag(const MArray< DComplex > &arr)
T avdev(const MArray< T > &a)
LatticeExprNode real(const LatticeExprNode &expr)
Functor to add squared diff of right and base value to left.
MArray< T > slidingStddevs(const MArray< T > &a, const IPosition &halfBoxSize, Bool fillEdge=True)
LatticeExprNode sin(const LatticeExprNode &expr)
Numerical 1-argument functions.
MArray< T > pow(const MArray< T > &a, const Double &exp)
MArray< T > boxedMins(const MArray< T > &a, const IPosition &boxSize)
MArray< T > slidingSums(const MArray< T > &a, const IPosition &halfBoxSize, Bool fillEdge=True)
Get sliding sums.
MArray< T > fabs(const MArray< T > &a)
TableExprNode amplitude(const TableExprNode &node)
The amplitude (i.e.