72 CLAM_ASSERT(mMemorized,
"Using a value that has not been memorized");
89 template <
bool abs=false,
class T=TData,
class U=TData,
int initOrder=5>
class StatsTmpl
97 StatsTmpl(
const Array<T>* data):mMoments(initOrder,5),mCentralMoments(initOrder,5),mCenterOfGravities(initOrder,5)
104 mCentralMoments.
SetSize(initOrder);
105 mCenterOfGravities.
SetSize(initOrder);
106 for(
unsigned i=0;i<initOrder;i++)
109 mCentralMoments[i]=
NULL;
110 mCenterOfGravities[i]=
NULL;
116 for (
int i=0;i<mMoments.
Size();i++)
118 if(mMoments[i])
delete mMoments[i];
120 for (
int i=0;i<mCentralMoments.
Size();i++)
122 if(mCentralMoments[i])
delete mCentralMoments[i];
124 for (
int i=0;i<mCenterOfGravities.
Size();i++)
126 if(mCenterOfGravities[i])
delete mCenterOfGravities[i];
151 if(moments.
Size()<order)
157 GetChainedMoment((
const O<order>*)(0));
175 if(centralMoments.
Size()<order)
177 centralMoments.
Resize(order);
180 pTmpArray=¢ralMoments;
181 GetChainedCentralMoment((
const O<order>*)(0));
199 if(centerOfGravities.
Size()<order)
201 centerOfGravities.
Resize(order);
202 centerOfGravities.
SetSize(order);
204 pTmpArray=¢erOfGravities;
205 GetChainedCenterOfGravity((
const O<order>*)(0));
218 if (mData->Size()<=0)
return U(.0);
244 if (mCentroid.
HasValue())
return mCentroid;
245 unsigned N = mData->Size();
249 mCentroid =
U(N-1)/2;
253 for (
unsigned i = 0; i < N; i++)
255 centroid += (abs?
Abs((*mData)[i]):(*mData)[i]) * (i+1);
257 mCentroid=centroid/mean/
U(N) - 1;
300 const unsigned N = mData->Size();
307 for (
unsigned i=0; i<N; i++)
309 U centroidDistance = i - centroid;
310 centroidDistance *= centroidDistance;
311 variance += centroidDistance * data[i];
315 if (sumMags < 1e-14)
return U(N+1) * (N-1) / 12;
317 return variance / sumMags;
323 return mStdDev(*mData,GetCentralMomentFunctor<2>(),
true);
357 return mSkew(*mData,mStdDev,GetCentralMomentFunctor<3>(),
true);
385 return mKurtosis(*mData,GetCentralMomentFunctor<2>(),GetCentralMomentFunctor<4>(),
true);
413 return mEnergy(*mData);
435 return mGeometricMean(*mData);
453 return mMaxElement(*mData);
459 return mMinElement(*mData);
499 const TSize size = mData->Size();
532 return 6*(2*
GetCentroid() - size + 1) / (size * (size-1) * (size+1));
556 if (mean<1e-20) mean=
TData(1e-20);
557 if (geometricMean<1e-20 ) geometricMean=
TData(1e-20);
558 return geometricMean/mean;
570 for (
int i=0;i<mMoments.
Size();i++)
571 if(mMoments[i]!=
NULL) mMoments[i]->Reset();
572 for (
int i=0;i<mCentralMoments.
Size();i++)
573 if(mCentralMoments[i]!=
NULL) mCentralMoments[i]->Reset();
574 for (
int i=0;i<mCenterOfGravities.
Size();i++)
575 if(mCenterOfGravities[i]!=
NULL) mCenterOfGravities[i]->Reset();
582 mGeometricMean.Reset();
596 const TSize size = mData->Size();
601 for (
unsigned i=0;i<size;i++)
612 for (
unsigned i=0;i<size;i++)
614 Tilt += (1/Y[i] *(i-d1/d2));
615 TData ti = m1/Y[i]*(i - (d1/d2));
619 Tilt*= (m1*m1/SumTi2);
624 template<
int order>
void InitMoment(
const O<order>*)
626 if(mMoments[order-1]!=
NULL)
627 delete mMoments[order-1];
628 mMoments[order-1]=
new Moment<order,abs,T,U>;
629 if(mCentralMoments[order-1]!=
NULL)
630 delete mCentralMoments[order-1];
631 mCentralMoments[order-1]=
new CentralMoment<order,abs,T,U>;
632 if(mCenterOfGravities[order-1]!=
NULL)
633 delete mCenterOfGravities[order-1];
634 mCenterOfGravities[order-1]=
new CenterOfGravity<order,abs,T,U>;
635 InitMoment((O<order-1>*)(0));
639 void InitMoment(O<1>*)
641 mMoments[0]=
new Moment<1,abs,T,U>;
642 mCentralMoments[0]=
new CentralMoment<1,abs,T,U>;
643 mCenterOfGravities[0]=
new CenterOfGravity<1,abs,T,U>;
649 return (*(
dynamic_cast<Moment<order,abs,T,U>*
> (mMoments[order-1])))(*mData);
655 if(order>mMoments.
Size())
657 int previousSize=mMoments.
Size();
660 for(
int i=previousSize;i<order;i++) mMoments[i]=
NULL;
663 if(mMoments[order-1]==
NULL)
665 mMoments[order-1]=
new Moment<order,abs,T,U>;
668 return (*(
dynamic_cast<Moment<order,abs,T,U>*
> (mMoments[order-1])))(*mData);
672 template<
int order>
void GetChainedMoment(
const O<order>* )
674 (*pTmpArray)[order-1]=
GetMoment((
const O<order>*)(0));
675 GetChainedMoment((O<order-1>*)(0));
679 void GetChainedMoment(O<1>* )
687 CentralMoment<order,abs,T,U> & tmpMoment = GetCentralMomentFunctor<order>();
690 for(
int i=0;i<order;i++)
693 if(mMoments[i]==
NULL)
694 return tmpMoment(*mData);
698 return tmpMoment(*mData,mMoments);
704 if(order>mCentralMoments.
Size())
706 const int previousSize=mCentralMoments.
Size();
707 mCentralMoments.
Resize(order+1);
708 mCentralMoments.
SetSize(order+1);
709 for(
int i=previousSize; i<order; i++) mCentralMoments[i]=
NULL;
711 if(mCentralMoments[order-1]==
NULL)
713 mCentralMoments[order-1] =
new CentralMoment<order,abs,T,U>;
722 template<
int order>
void GetChainedCentralMoment(
const O<order>* )
725 GetChainedCentralMoment((O<order-1>*)(0));
729 void GetChainedCentralMoment(O<1>* )
737 return (*
dynamic_cast<CenterOfGravity<order,abs,T,U>*
> (mCenterOfGravities[order-1]))(*mData);
743 if(order>mCenterOfGravities.
Size())
745 int previousSize=mCenterOfGravities.
Size();
746 mCenterOfGravities.
Resize(order);
747 mCenterOfGravities.
SetSize(order);
748 for(
int i=previousSize;i<order;i++) mCenterOfGravities[i]=
NULL;
750 if(mCenterOfGravities[order-1]=
NULL)
752 mCenterOfGravities[order-1]=
new CenterOfGravity<order,abs,T,U>;
759 template<
int order>
void GetChainedCenterOfGravity(
const O<order>* )
762 GetChainedCenterOfGravity((O<order-1>*)(0));
766 void GetChainedCenterOfGravity(O<1>* )
771 template <
unsigned order>
772 CentralMoment<order,abs,T,U> & GetCentralMomentFunctor()
775 "Calling for a Central Moment order above the configured one");
777 typedef CentralMoment<order,abs,T,U> CentralMomentN;
778 const unsigned int position = order-1;
779 if (!mCentralMoments[position])
780 mCentralMoments[position] =
new CentralMomentN;
781 return *
dynamic_cast<CentralMomentN*
>(mCentralMoments[position]);
785 Array<BaseMemOp*> mMoments;
786 Array<BaseMemOp*> mCentralMoments;
787 Array<BaseMemOp*> mCenterOfGravities;
788 KurtosisTmpl<abs,T,U> mKurtosis;
789 SkewTmpl<abs,T,U> mSkew;
790 StandardDeviationTmpl<abs,T,U> mStdDev;
791 EnergyTmpl<T> mEnergy;
793 GeometricMeanTmpl<T,U> mGeometricMean;
794 ComplexMaxElement<abs,T> mMaxElement;
795 ComplexMinElement<abs,T> mMinElement;
796 StatMemory<U> mCentroid;
798 const Array<T>* mData;