00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef HxExportExtraIdentMaskCentralMoments_h
00011 #define HxExportExtraIdentMaskCentralMoments_h
00012
00013 #include "HxClassName.h"
00014 #include "HxSizes.h"
00015 #include "HxCategories.h"
00016 #include "HxTagList.h"
00017
00018
00042 template<class ResultT, class ImValT, class ExtraValT>
00043 class HxExportExtraIdentMaskCentralMoments
00044 {
00045 public:
00047 typedef HxTagTransVar TransVarianceCategory;
00048
00050 typedef HxTagNPhase PhaseCategory;
00051
00052
00054 HxExportExtraIdentMaskCentralMoments(HxTagList& tags);
00055
00057 ~HxExportExtraIdentMaskCentralMoments();
00058
00060 int nrPhases() const;
00061
00063 void init(int phase);
00064
00066 void doIt(const ImValT& imV, const ExtraValT& extraV,
00067 int x, int y, int z);
00068
00070 void done(int phase);
00071
00073 static HxString className();
00074
00075 private:
00076 HxTagList& _tags;
00077 HxValueList* _valList;
00078 ExtraValT _maskVal;
00079 int _order;
00080 int _number;
00081 ResultT _m00;
00082 ResultT _m10;
00083 ResultT _m01;
00084 ResultT _xBar;
00085 ResultT _yBar;
00086 ResultT* _sums;
00087 int _curPhase;
00088 };
00089
00090 template<class ResultT, class ImValT, class ExtraValT>
00091
00092 HxExportExtraIdentMaskCentralMoments<ResultT,ImValT,ExtraValT>::HxExportExtraIdentMaskCentralMoments(HxTagList& tags) : _tags(tags)
00093 {
00094 _maskVal = HxGetTag<int>(tags, "maskVal");
00095 _order = HxGetTag<int>(tags, "order");
00096 _valList = HxGetTag<HxValueList*>(tags, "valList");
00097 _number = ((_order+1)*(_order+2))/2;
00098 _sums = new ResultT[_number];
00099 ResultT *ptr = _sums;
00100 for (int i=0 ; i<_number; i++)
00101 *ptr++ = HxScalarInt(0);
00102 }
00103
00104 template<class ResultT, class ImValT, class ExtraValT>
00105
00106 HxExportExtraIdentMaskCentralMoments<ResultT,ImValT,ExtraValT> ::~HxExportExtraIdentMaskCentralMoments()
00107 {
00108 HxValueListBackInserter res = std::back_inserter(*_valList);
00109 for (int i=0 ; i<_number ; i++)
00110 *res++ = HxValue(_sums[i]);
00111 delete _sums;
00112 }
00113
00114 template<class ResultT, class ImValT, class ExtraValT>
00115 inline int
00116 HxExportExtraIdentMaskCentralMoments<ResultT,ImValT,ExtraValT>::nrPhases() const
00117 {
00118 return 2;
00119 }
00120
00121 template<class ResultT, class ImValT, class ExtraValT>
00122 inline void
00123 HxExportExtraIdentMaskCentralMoments<ResultT,ImValT,ExtraValT>::init(int phase)
00124 {
00125 _curPhase = phase;
00126 if (phase == 1) {
00127 _m00 = HxScalarInt(0);
00128 _m10 = HxScalarInt(0);
00129 _m01 = HxScalarInt(0);
00130 } else {
00131 _xBar = _m10 / _m00;
00132 _yBar = _m01 / _m00;
00133 }
00134 }
00135
00136 template<class ResultT, class ImValT, class ExtraValT>
00137 inline void
00138
00139 HxExportExtraIdentMaskCentralMoments<ResultT,ImValT,ExtraValT> ::doIt(const ImValT& imV, const ExtraValT& extraV, int x, int y, int)
00140 {
00141 if (extraV != _maskVal)
00142 return;
00143 if (_curPhase == 1) {
00144 _m00 += imV;
00145 _m10 += ResultT(HxScalarDouble(x)) * ResultT(imV);
00146 _m01 += ResultT(HxScalarDouble(y)) * ResultT(imV);
00147 } else {
00148 ResultT xx = ResultT(HxScalarDouble(x)) - _xBar;
00149 ResultT yy = ResultT(HxScalarDouble(y)) - _yBar;
00150 int i=0;
00151 for (int q=0 ; q<=_order ; q++) {
00152 for (int p=0 ; p<=_order ; p++) {
00153 if (p+q <= _order) {
00154 _sums[i] += xx.pow(HxScalarInt(p)) * yy.pow(HxScalarInt(q)) * ResultT(imV);
00155 i++;
00156 }
00157 }
00158 }
00159 }
00160 }
00161
00162 template<class ResultT, class ImValT, class ExtraValT>
00163 inline void
00164 HxExportExtraIdentMaskCentralMoments<ResultT,ImValT,ExtraValT>::done(int phase)
00165 {
00166 }
00167
00168 template<class ResultT, class ImValT, class ExtraValT>
00169 inline HxString
00170 HxExportExtraIdentMaskCentralMoments<ResultT,ImValT,ExtraValT>::className()
00171 {
00172 return HxString("identMaskCentralMoments");
00173 }
00174
00175
00176 #endif