bool LtBackSubstitute(const MatrixTemplate<T>& a, const VectorTemplate<T>& b, VectorTemplate<T>& x) { Assert(a.isSquare()); Assert(a.n == b.n); if(x.empty()) x.resize(a.n); else Assert(a.n == x.n); int n=a.n; T aii,sum; for(int i=n-1; i>=0; i--) { aii=a(i,i); sum=b[i]; for(int j=i+1; j<n; j++) sum-=a(j,i)*x[j]; if(aii == 0) { if(!FuzzyZero(sum,(T)kBackSubZeroTolerance)) { //LOG4CXX_ERROR(KrisLibrary::logger(),"LtBackSubstitute: dividing by zero: "<<sum<<"/"<<aii); return false; } x[i]=0; } else x[i]=sum/aii; } return true; }
bool LBackSubstitute(const MatrixTemplate<T>& a, const VectorTemplate<T>& b, VectorTemplate<T>& x) { Assert(a.isSquare()); Assert(a.n == b.n); if(x.empty()) x.resize(a.n); else Assert(a.n == x.n); int n=a.n; T aii,sum; for(int i=0; i<n; i++) { aii=a(i,i); sum=b[i]; for(int j=0; j<i; j++) sum-=a(i,j)*x[j]; if(aii == 0) { if(!FuzzyZero(sum,(T)kBackSubZeroTolerance)) { //cerr<<"LBackSubstitute: dividing by zero: "<<sum<<"/"<<aii<<endl; //cerr<<MatrixPrinter(a)<<endl; return false; } x[i]=0; } else x[i]=sum/aii; } return true; }
void U1BackSubstitute(const MatrixTemplate<T>& a, const VectorTemplate<T>& b, VectorTemplate<T>& x) { Assert(a.isSquare()); Assert(a.n == b.n); if(x.empty()) x.resize(a.n); else Assert(a.n == x.n); int n=a.n; T sum; for(int i=n-1; i>=0; i--) { sum=b(i); for(int j=i+1; j<n; j++) sum-=a(i,j)*x[j]; x[i]=sum; } }
void L1BackSubstitute(const MatrixTemplate<T>& a, const VectorTemplate<T>& b, VectorTemplate<T>& x) { Assert(a.isSquare()); Assert(a.n == b.n); if(x.empty()) x.resize(a.n); else Assert(a.n == x.n); int n=a.n; T sum; for(int i=0; i<n; i++) { sum=b[i]; for(int j=0; j<i; j++) sum-=a(i,j)*x[j]; x[i]=sum; } }
void VectorTemplate<T>::copy(const VectorTemplate<T2>& a) { CHECKRESIZE(a.n); VectorIterator<T> k=begin(); VectorIterator<T2> ak=a.begin(); for(int i=0;i<n;i++,k++,ak++) *k = (T)*ak; }
T HouseholderTransform(VectorTemplate<T>& v) { Assert(v.n != 0); if (v.n == 1) return 0; T alpha, beta, tau ; VectorTemplate<T> x; x.setRef(v,1); T xnorm = x.norm(); if (xnorm == 0) { return 0; } alpha = v(0); beta = - (alpha >= 0.0 ? 1 : -1) * pythag(alpha, xnorm); tau = (beta - alpha) / beta ; x.inplaceDiv(alpha-beta); v(0)=beta; return tau; }