00198 {
00199 if (mStatValid)
00200 return;
00201
00202 typedef typename ArrayT::ArithType ArithT;
00203 ArithT num = Element::E1Cast(mNum, ArithT());
00204 ArithT num1 = num - Element::E1Cast(1, ArithT());
00205 if (mRunning)
00206 {
00207 Set(mSum, mRunList[0]);
00208 Mul(mSumSqr, mSum, mSum);
00209 Abs(mSumAbs, mSum);
00210 if (mTmp == 0)
00211 Set(mTmp, mSum);
00212 for (int i=1 ; i<mRunList.size() ; i++)
00213 {
00214 Add(mSum, mSum, mRunList[i]);
00215 Mul(mTmp, mRunList[i], mRunList[i]);
00216 Add(mSumSqr, mSumSqr, mTmp);
00217 Abs(mTmp, mRunList[i]);
00218 Add(mSumAbs, mSumAbs, mTmp);
00219 }
00220 }
00221 DivVal(mMean, mSum, num);
00222 if (mNum == 1)
00223 SetVal(mVariance, mTmp, Element::E1Cast(0, ArithT()));
00224 else
00225 {
00226 Mul(mTmp, mSum, mSum);
00227 DivVal(mTmp, mTmp, num);
00228 Sub(mTmp, mSumSqr, mTmp);
00229 DivVal(mVariance, mTmp, num1);
00230 }
00231 mStatValid = true;
00232 }