inline bool LBackSubstitute(const MatrixTemplate<T>& a, const MatrixTemplate<T>& b, MatrixTemplate<T>& x) { if(x.isEmpty()) x.resize(a.n,b.n); else Assert(x.m == a.n && x.n == b.n); for(int i=0;i<x.n;i++) { VectorTemplate<T> xi,bi; x.getColRef(i,xi); b.getColRef(i,bi); if(!LBackSubstitute(a,bi,xi)) return false; } return true; }
T Gaussian<T>::probability(const VectorT& x) const { int d = numDims(); T det=One; for(int i=0;i<d;i++) det*=L(i,i); T invc = Pow(2.0*Pi,0.5*T(d))*det; VectorT x_mu,y; x_mu.sub(x,mu); y.resize(L.n); LBackSubstitute(L,x_mu,y); return Exp(-Half*y.normSquared())/invc; }