00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef CASA_MASKARRMATH_H
00029 #define CASA_MASKARRMATH_H
00030
00031
00032 #include <casacore/casa/aips.h>
00033 #include <casacore/casa/BasicMath/Math.h>
00034 #include <casacore/casa/Arrays/Array.h>
00035 #include <casacore/casa/Arrays/MaskedArray.h>
00036 #include <casacore/casa/Arrays/IPosition.h>
00037
00038 #include <casacore/casa/BasicSL/Complex.h>
00039
00040
00041 namespace casacore {
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 template<class T> const MaskedArray<T> & operator+= (const MaskedArray<T> &left, const Array<T> &other);
00126 template<class T> const MaskedArray<T> & operator-= (const MaskedArray<T> &left, const Array<T> &other);
00127 template<class T> const MaskedArray<T> & operator*= (const MaskedArray<T> &left, const Array<T> &other);
00128 template<class T> const MaskedArray<T> & operator/= (const MaskedArray<T> &left, const Array<T> &other);
00129 template<class T> Array<T> & operator+= (Array<T> &left, const MaskedArray<T> &other);
00130 template<class T> Array<T> & operator-= (Array<T> &left, const MaskedArray<T> &other);
00131 template<class T> Array<T> & operator*= (Array<T> &left, const MaskedArray<T> &other);
00132 template<class T> Array<T> & operator/= (Array<T> &left, const MaskedArray<T> &other);
00133 template<class T> const MaskedArray<T> & operator+= (const MaskedArray<T> &left, const MaskedArray<T> &other);
00134 template<class T> const MaskedArray<T> & operator-= (const MaskedArray<T> &left, const MaskedArray<T> &other);
00135 template<class T> const MaskedArray<T> & operator*= (const MaskedArray<T> &left, const MaskedArray<T> &other);
00136 template<class T> const MaskedArray<T> & operator/= (const MaskedArray<T> &left,const MaskedArray<T> &other);
00137 template<class T,class S> const MaskedArray<T> & operator/= (const MaskedArray<T> &left,const MaskedArray<S> &other);
00138
00139
00140
00141
00142
00143
00144 template<class T> const MaskedArray<T> & operator+= (const MaskedArray<T> &left,const T &other);
00145 template<class T> const MaskedArray<T> & operator-= (const MaskedArray<T> &left,const T &other);
00146 template<class T> const MaskedArray<T> & operator*= (const MaskedArray<T> &left,const T &other);
00147 template<class T> const MaskedArray<T> & operator/= (const MaskedArray<T> &left,const T &other);
00148
00149
00150
00151
00152
00153 template<class T> MaskedArray<T> operator+(const MaskedArray<T> &a);
00154 template<class T> MaskedArray<T> operator-(const MaskedArray<T> &a);
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165 template<class T> MaskedArray<T> operator+ (const MaskedArray<T> &left, const Array<T> &right);
00166 template<class T> MaskedArray<T> operator- (const MaskedArray<T> &left, const Array<T> &right);
00167 template<class T> MaskedArray<T> operator* (const MaskedArray<T> &left, const Array<T> &right);
00168 template<class T> MaskedArray<T> operator/ (const MaskedArray<T> &left, const Array<T> &right);
00169 template<class T> MaskedArray<T> operator+ (const Array<T> &left, const MaskedArray<T> &right);
00170 template<class T> MaskedArray<T> operator- (const Array<T> &left, const MaskedArray<T> &right);
00171 template<class T> MaskedArray<T> operator* (const Array<T> &left, const MaskedArray<T> &right);
00172 template<class T> MaskedArray<T> operator/ (const Array<T> &left, const MaskedArray<T> &right);
00173 template<class T> MaskedArray<T> operator+ (const MaskedArray<T> &left,const MaskedArray<T> &right);
00174 template<class T> MaskedArray<T> operator- (const MaskedArray<T> &left,const MaskedArray<T> &right);
00175 template<class T> MaskedArray<T> operator* (const MaskedArray<T> &left,const MaskedArray<T> &right);
00176 template<class T> MaskedArray<T> operator/ (const MaskedArray<T> &left,const MaskedArray<T> &right);
00177
00178
00179
00180
00181
00182
00183 template<class T> MaskedArray<T> operator+ (const MaskedArray<T> &left, const T &right);
00184 template<class T> MaskedArray<T> operator- (const MaskedArray<T> &left, const T &right);
00185 template<class T> MaskedArray<T> operator* (const MaskedArray<T> &left, const T &right);
00186 template<class T> MaskedArray<T> operator/ (const MaskedArray<T> &left, const T &right);
00187 MaskedArray<Complex> operator* (const MaskedArray<Complex> &left, const Float &right);
00188
00189
00190
00191
00192
00193
00194 template<class T> MaskedArray<T> operator+ (const T &left, const MaskedArray<T> &right);
00195 template<class T> MaskedArray<T> operator- (const T &left, const MaskedArray<T> &right);
00196 template<class T> MaskedArray<T> operator* (const T &left, const MaskedArray<T> &right);
00197 template<class T> MaskedArray<T> operator/ (const T &left, const MaskedArray<T> &right);
00198 MaskedArray<Complex> operator* (const Float &left, const MaskedArray<Complex> &right);
00199
00200
00201
00202
00203
00204
00205
00206 template<class T> MaskedArray<T> sin(const MaskedArray<T> &left);
00207 template<class T> MaskedArray<T> cos(const MaskedArray<T> &left);
00208 template<class T> MaskedArray<T> tan(const MaskedArray<T> &left);
00209 template<class T> MaskedArray<T> asin(const MaskedArray<T> &left);
00210 template<class T> MaskedArray<T> acos(const MaskedArray<T> &left);
00211 template<class T> MaskedArray<T> atan(const MaskedArray<T> &left);
00212 template<class T> MaskedArray<T> sinh(const MaskedArray<T> &left);
00213 template<class T> MaskedArray<T> cosh(const MaskedArray<T> &left);
00214 template<class T> MaskedArray<T> tanh(const MaskedArray<T> &left);
00215 template<class T> MaskedArray<T> exp(const MaskedArray<T> &left);
00216 template<class T> MaskedArray<T> log(const MaskedArray<T> &left);
00217 template<class T> MaskedArray<T> log10(const MaskedArray<T> &left);
00218 template<class T> MaskedArray<T> sqrt(const MaskedArray<T> &left);
00219 template<class T> MaskedArray<T> abs(const MaskedArray<T> &left);
00220 template<class T> MaskedArray<T> fabs(const MaskedArray<T> &left);
00221 template<class T> MaskedArray<T> ceil(const MaskedArray<T> &left);
00222 template<class T> MaskedArray<T> floor(const MaskedArray<T> &left);
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233 template<class T> MaskedArray<T> atan2(const MaskedArray<T> &left, const Array<T> &right);
00234 template<class T> MaskedArray<T> fmod(const MaskedArray<T> &left, const Array<T> &right);
00235 template<class T> MaskedArray<T> atan2(const Array<T> &left, const MaskedArray<T> &right);
00236 template<class T> MaskedArray<T> fmod(const Array<T> &left, const MaskedArray<T> &right);
00237 template<class T> MaskedArray<T> atan2(const MaskedArray<T> &left,const MaskedArray<T> &right);
00238 template<class T> MaskedArray<T> fmod(const MaskedArray<T> &left,const MaskedArray<T> &right);
00239 template<class T> MaskedArray<T> atan2(const MaskedArray<T> &left, const T &right);
00240 template<class T> MaskedArray<T> fmod(const MaskedArray<T> &left, const T &right);
00241 template<class T> MaskedArray<T> atan2(const T &left, const MaskedArray<T> &right);
00242 template<class T> MaskedArray<T> fmod(const T &left, const MaskedArray<T> &right);
00243 template<class T, class U> MaskedArray<T> pow(const MaskedArray<T> &left, const Array<U> &right);
00244 template<class T, class U> MaskedArray<T> pow(const Array<T> &left, const MaskedArray<U> &right);
00245 template<class T, class U> MaskedArray<T> pow(const MaskedArray<T> &left,const MaskedArray<U> &right);
00246 template<class T> MaskedArray<T> pow(const MaskedArray<T> &left, const Double &right);
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 template<class T> void minMax(T &minVal, T &maxVal, IPosition &minPos, IPosition &maxPos,const MaskedArray<T> &marray);
00259 template<class T> void minMax(T &minVal, T &maxVal,const MaskedArray<T> &marray);
00260
00261
00262
00263
00264
00265
00266
00267 template<class T> T min(const MaskedArray<T> &left);
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279 template<class T> MaskedArray<T> min(const MaskedArray<T> &left, const Array<T> &right);
00280 template<class T> MaskedArray<T> min(const Array<T> &left, const MaskedArray<T> &right);
00281 template<class T> MaskedArray<T> min(const MaskedArray<T> &left, const MaskedArray<T> &right);
00282 template<class T> MaskedArray<T> min(const T &left, const MaskedArray<T> &right);
00283 template<class T> MaskedArray<T> min(const MaskedArray<T> &left, const T &right);
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294 template<class T> void min(const MaskedArray<T> &result, const Array<T> &left, const Array<T> &right);
00295
00296
00297
00298 template<class T> T max(const MaskedArray<T> &left);
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310 template<class T> MaskedArray<T> max(const MaskedArray<T> &left, const Array<T> &right);
00311 template<class T> MaskedArray<T> max(const Array<T> &left, const MaskedArray<T> &right);
00312 template<class T> MaskedArray<T> max(const MaskedArray<T> &left, const MaskedArray<T> &right);
00313 template<class T> MaskedArray<T> max(const T &left, const MaskedArray<T> &right);
00314 template<class T> MaskedArray<T> max(const MaskedArray<T> &left, const T &right);
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325 template<class T> void max(const MaskedArray<T> &result,const Array<T> &left, const Array<T> &right);
00326
00327
00328
00329
00330
00331
00332 template<class T> void indgen(MaskedArray<T> &a, T start, T inc);
00333
00334
00335
00336
00337
00338
00339 template<class T> void indgen(MaskedArray<T> &a);
00340
00341
00342
00343
00344
00345
00346 template<class T> void indgen(MaskedArray<T> &a, T start);
00347
00348
00349
00350
00351
00352
00353
00354 template<class T> T sum(const MaskedArray<T> &a);
00355
00356
00357
00358 template<class T> T sumsquares(const MaskedArray<T> &a);
00359
00360
00361
00362
00363 template<class T> T product(const MaskedArray<T> &a);
00364
00365
00366
00367
00368 template<class T> T mean(const MaskedArray<T> &a);
00369
00370
00371
00372
00373 template<class T> T variance(const MaskedArray<T> &a);
00374
00375
00376
00377
00378
00379 template<class T> T variance(const MaskedArray<T> &a, T mean);
00380
00381
00382
00383 template<class T> T stddev(const MaskedArray<T> &a);
00384
00385
00386
00387
00388 template<class T> T stddev(const MaskedArray<T> &a, T mean);
00389
00390
00391
00392
00393 template<class T> T avdev(const MaskedArray<T> &a);
00394
00395
00396
00397
00398
00399 template<class T> T avdev(const MaskedArray<T> &a,T mean);
00400
00401
00402
00403 template<class T> T rms(const MaskedArray<T> &a);
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418 template<class T> inline T median(const MaskedArray<T> &a, Bool sorted=False)
00419 { return median (a, sorted, (a.nelements() <= 100)); }
00420 template<class T> T median(const MaskedArray<T> &a, Bool sorted,
00421 Bool takeEvenMean);
00422
00423
00424
00425
00426
00427 template<class T> inline T madfm(const MaskedArray<T> &a, Bool sorted=False)
00428 { return madfm (a, sorted, (a.nelements() <= 100)); }
00429 template<class T> T madfm(const MaskedArray<T> &a, Bool sorted,
00430 Bool takeEvenMean);
00431
00432
00433
00434
00435 template<class T> MaskedArray<T> square(const MaskedArray<T> &val);
00436
00437
00438 template<class T> MaskedArray<T> cube(const MaskedArray<T> &val);
00439
00440
00441
00442
00443 template<typename T> class MaskedSumFunc {
00444 public:
00445 T operator() (const MaskedArray<T>& arr) const { return sum(arr); }
00446 };
00447 template<typename T> class MaskedProductFunc {
00448 public:
00449 T operator() (const MaskedArray<T>& arr) const { return product(arr); }
00450 };
00451 template<typename T> class MaskedMinFunc {
00452 public:
00453 T operator() (const MaskedArray<T>& arr) const { return min(arr); }
00454 };
00455 template<typename T> class MaskedMaxFunc {
00456 public:
00457 T operator() (const MaskedArray<T>& arr) const { return max(arr); }
00458 };
00459 template<typename T> class MaskedMeanFunc {
00460 public:
00461 T operator() (const MaskedArray<T>& arr) const { return mean(arr); }
00462 };
00463 template<typename T> class MaskedVarianceFunc {
00464 public:
00465 T operator() (const MaskedArray<T>& arr) const { return variance(arr); }
00466 };
00467 template<typename T> class MaskedStddevFunc {
00468 public:
00469 T operator() (const MaskedArray<T>& arr) const { return stddev(arr); }
00470 };
00471 template<typename T> class MaskedAvdevFunc {
00472 public:
00473 T operator() (const MaskedArray<T>& arr) const { return avdev(arr); }
00474 };
00475 template<typename T> class MaskedRmsFunc {
00476 public:
00477 T operator() (const MaskedArray<T>& arr) const { return rms(arr); }
00478 };
00479 template<typename T> class MaskedMedianFunc {
00480 public:
00481 explicit MaskedMedianFunc (Bool sorted=False, Bool takeEvenMean=True)
00482 : itsSorted(sorted), itsTakeEvenMean(takeEvenMean) {}
00483 T operator() (const MaskedArray<T>& arr) const
00484 { return median(arr, itsSorted, itsTakeEvenMean); }
00485 private:
00486 Bool itsSorted;
00487 Bool itsTakeEvenMean;
00488 Bool itsInPlace;
00489 };
00490 template<typename T> class MaskedMadfmFunc {
00491 public:
00492 explicit MaskedMadfmFunc(Bool sorted=False, Bool takeEvenMean=True)
00493 : itsSorted(sorted), itsTakeEvenMean(takeEvenMean) {}
00494 Float operator()(const MaskedArray<Float>& arr) const
00495 { return madfm(arr, itsSorted, itsTakeEvenMean); }
00496 private:
00497 Bool itsSorted;
00498 Bool itsTakeEvenMean;
00499 Bool itsInPlace;
00500 };
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514 template <typename T, typename FuncType>
00515 MaskedArray<T> boxedArrayMath (const MaskedArray<T>& array,
00516 const IPosition& boxSize,
00517 const FuncType& funcObj);
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543 template <typename T, typename FuncType>
00544 Array<T> slidingArrayMath (const MaskedArray<T>& array,
00545 const IPosition& halfBoxSize,
00546 const FuncType& funcObj,
00547 Bool fillEdge=True);
00548
00549
00550 }
00551
00552 #ifndef CASACORE_NO_AUTO_TEMPLATES
00553 #include <casacore/casa/Arrays/MaskArrMath.tcc>
00554 #endif //# CASACORE_NO_AUTO_TEMPLATES
00555 #endif