Single Value Decomposition class For an (m x n) matrix A with m >= n, the singular value decomposition is an (m x m) orthogonal matrix fU, an (m x n) diagonal matrix fS, and an (n x n) orthogonal matrix fV so that A = U*S*V'. If the row/column index of A starts at (rowLwb,colLwb) then the decomposed matrices/vectors start at : fU : (rowLwb,colLwb) fV : (colLwb,colLwb) fSig : (colLwb) The diagonal matrix fS is stored in the singular values vector fSig . The singular values, fSig[k] = S[k][k], are ordered so that fSig[0] >= fSig[1] >= ... >= fSig[n-1]. The singular value decompostion always exists, so the decomposition will (as long as m >=n) never fail. If m < n, the user should add sufficient zero rows to A , so that m == n Here fTol is used to set the threshold on the minimum allowed value of the singular values: min_singular = fTol*max(fSig[i])
| TDecompSVD() | |
| TDecompSVD(const TDecompSVD& another) | |
| TDecompSVD(Int_t nrows, Int_t ncols) | |
| TDecompSVD(const TMatrixD& m, Double_t tol = 0.0) | |
| TDecompSVD(Int_t row_lwb, Int_t row_upb, Int_t col_lwb, Int_t col_upb) | |
| virtual | ~TDecompSVD() | 
| void | TObject::AbstractMethod(const char* method) const | 
| virtual void | TObject::AppendPad(Option_t* option = "") | 
| virtual void | TObject::Browse(TBrowser* b) | 
| static TClass* | Class() | 
| virtual const char* | TObject::ClassName() const | 
| virtual void | TObject::Clear(Option_t* = "") | 
| virtual TObject* | TObject::Clone(const char* newname = "") const | 
| virtual Int_t | TObject::Compare(const TObject* obj) const | 
| virtual Double_t | Condition() | 
| virtual void | TObject::Copy(TObject& object) const | 
| virtual Bool_t | Decompose() | 
| virtual void | TObject::Delete(Option_t* option = "")MENU | 
| virtual void | Det(Double_t& d1, Double_t& d2) | 
| virtual Int_t | TObject::DistancetoPrimitive(Int_t px, Int_t py) | 
| virtual void | TObject::Draw(Option_t* option = "") | 
| virtual void | TObject::DrawClass() constMENU | 
| virtual TObject* | TObject::DrawClone(Option_t* option = "") constMENU | 
| virtual void | TObject::Dump() constMENU | 
| virtual void | TObject::Error(const char* method, const char* msgfmt) const | 
| virtual void | TObject::Execute(const char* method, const char* params, Int_t* error = 0) | 
| virtual void | TObject::Execute(TMethod* method, TObjArray* params, Int_t* error = 0) | 
| virtual void | TObject::ExecuteEvent(Int_t event, Int_t px, Int_t py) | 
| virtual void | TObject::Fatal(const char* method, const char* msgfmt) const | 
| virtual TObject* | TObject::FindObject(const char* name) const | 
| virtual TObject* | TObject::FindObject(const TObject* obj) const | 
| Int_t | TDecompBase::GetColLwb() const | 
| Double_t | TDecompBase::GetCondition() const | 
| Double_t | TDecompBase::GetDet1() const | 
| Double_t | TDecompBase::GetDet2() const | 
| virtual Option_t* | TObject::GetDrawOption() const | 
| static Long_t | TObject::GetDtorOnly() | 
| virtual const char* | TObject::GetIconName() const | 
| const TMatrixD | GetMatrix() | 
| virtual const char* | TObject::GetName() const | 
| virtual Int_t | GetNcols() const | 
| virtual Int_t | GetNrows() const | 
| virtual char* | TObject::GetObjectInfo(Int_t px, Int_t py) const | 
| static Bool_t | TObject::GetObjectStat() | 
| virtual Option_t* | TObject::GetOption() const | 
| Int_t | TDecompBase::GetRowLwb() const | 
| const TVectorD& | GetSig() | 
| virtual const char* | TObject::GetTitle() const | 
| Double_t | TDecompBase::GetTol() const | 
| const TMatrixD& | GetU() | 
| virtual UInt_t | TObject::GetUniqueID() const | 
| const TMatrixD& | GetV() | 
| virtual Bool_t | TObject::HandleTimer(TTimer* timer) | 
| virtual ULong_t | TObject::Hash() const | 
| virtual void | TObject::Info(const char* method, const char* msgfmt) const | 
| virtual Bool_t | TObject::InheritsFrom(const char* classname) const | 
| virtual Bool_t | TObject::InheritsFrom(const TClass* cl) const | 
| virtual void | TObject::Inspect() constMENU | 
| TMatrixD | Invert() | 
| Bool_t | Invert(TMatrixD& inv) | 
| TMatrixD | Invert(Bool_t& status) | 
| void | TObject::InvertBit(UInt_t f) | 
| virtual TClass* | IsA() const | 
| virtual Bool_t | TObject::IsEqual(const TObject* obj) const | 
| virtual Bool_t | TObject::IsFolder() const | 
| Bool_t | TObject::IsOnHeap() const | 
| virtual Bool_t | TObject::IsSortable() const | 
| Bool_t | TObject::IsZombie() const | 
| virtual void | TObject::ls(Option_t* option = "") const | 
| void | TObject::MayNotUse(const char* method) const | 
| virtual Bool_t | TDecompBase::MultiSolve(TMatrixD& B) | 
| virtual Bool_t | TObject::Notify() | 
| static void | TObject::operator delete(void* ptr) | 
| static void | TObject::operator delete(void* ptr, void* vp) | 
| static void | TObject::operator delete[](void* ptr) | 
| static void | TObject::operator delete[](void* ptr, void* vp) | 
| void* | TObject::operator new(size_t sz) | 
| void* | TObject::operator new(size_t sz, void* vp) | 
| void* | TObject::operator new[](size_t sz) | 
| void* | TObject::operator new[](size_t sz, void* vp) | 
| TDecompSVD& | operator=(const TDecompSVD& source) | 
| virtual void | TObject::Paint(Option_t* option = "") | 
| virtual void | TObject::Pop() | 
| virtual void | Print(Option_t* opt = "") constMENU | 
| virtual Int_t | TObject::Read(const char* name) | 
| virtual void | TObject::RecursiveRemove(TObject* obj) | 
| void | TObject::ResetBit(UInt_t f) | 
| virtual void | TObject::SaveAs(const char* filename = "", Option_t* option = "") constMENU | 
| virtual void | TObject::SavePrimitive(basic_ostream<char,char_traits<char> >& out, Option_t* option = "") | 
| void | TObject::SetBit(UInt_t f) | 
| void | TObject::SetBit(UInt_t f, Bool_t set) | 
| virtual void | TObject::SetDrawOption(Option_t* option = "")MENU | 
| static void | TObject::SetDtorOnly(void* obj) | 
| virtual void | SetMatrix(const TMatrixD& a) | 
| static void | TObject::SetObjectStat(Bool_t stat) | 
| Double_t | TDecompBase::SetTol(Double_t newTol) | 
| virtual void | TObject::SetUniqueID(UInt_t uid) | 
| virtual void | ShowMembers(TMemberInspector& insp, char* parent) | 
| virtual Bool_t | Solve(TVectorD& b) | 
| virtual Bool_t | Solve(TMatrixDColumn& b) | 
| virtual TVectorD | Solve(const TVectorD& b, Bool_t& ok) | 
| virtual void | Streamer(TBuffer& b) | 
| void | StreamerNVirtual(TBuffer& b) | 
| virtual void | TObject::SysError(const char* method, const char* msgfmt) const | 
| Bool_t | TObject::TestBit(UInt_t f) const | 
| Int_t | TObject::TestBits(UInt_t f) const | 
| virtual Bool_t | TransSolve(TVectorD& b) | 
| virtual Bool_t | TransSolve(TMatrixDColumn& b) | 
| virtual TVectorD | TransSolve(const TVectorD& b, Bool_t& ok) | 
| virtual void | TObject::UseCurrentStyle() | 
| virtual void | TObject::Warning(const char* method, const char* msgfmt) const | 
| virtual Int_t | TObject::Write(const char* name = 0, Int_t option = 0, Int_t bufsize = 0) | 
| virtual Int_t | TObject::Write(const char* name = 0, Int_t option = 0, Int_t bufsize = 0) const | 
| static Bool_t | Bidiagonalize(TMatrixD& v, TMatrixD& u, TVectorD& sDiag, TVectorD& oDiag) | 
| static void | Diag_1(TMatrixD& v, TVectorD& sDiag, TVectorD& oDiag, Int_t k) | 
| static void | Diag_2(TVectorD& sDiag, TVectorD& oDiag, Int_t k, Int_t l) | 
| static void | Diag_3(TMatrixD& v, TMatrixD& u, TVectorD& sDiag, TVectorD& oDiag, Int_t k, Int_t l) | 
| static Bool_t | Diagonalize(TMatrixD& v, TMatrixD& u, TVectorD& sDiag, TVectorD& oDiag) | 
| static void | TDecompBase::DiagProd(const TVectorD& diag, Double_t tol, Double_t& d1, Double_t& d2) | 
| virtual void | TObject::DoError(int level, const char* location, const char* fmt, va_list va) const | 
| virtual const TMatrixDBase& | GetDecompMatrix() const | 
| Int_t | TDecompBase::Hager(Double_t& est, Int_t iter = 5) | 
| void | TObject::MakeZombie() | 
| void | TDecompBase::ResetStatus() | 
| static void | SortSingular(TMatrixD& v, TMatrixD& u, TVectorD& sDiag) | 
| enum { | kWorkMax | |
| }; | ||
| enum TDecompBase::EMatrixDecompStat { | kInit | |
| kPatternSet | ||
| kValuesSet | ||
| kMatrixSet | ||
| kDecomposed | ||
| kDetermined | ||
| kCondition | ||
| kSingular | ||
| }; | ||
| enum TDecompBase::[unnamed] { | kWorkMax | |
| }; | ||
| enum TObject::EStatusBits { | kCanDelete | |
| kMustCleanup | ||
| kObjInCanvas | ||
| kIsReferenced | ||
| kHasUUID | ||
| kCannotPick | ||
| kNoContextMenu | ||
| kInvalidObject | ||
| }; | ||
| enum TObject::[unnamed] { | kIsOnHeap | |
| kNotDeleted | ||
| kZombie | ||
| kBitMask | ||
| kSingleKey | ||
| kOverwrite | ||
| kWriteDelete | ||
| }; | 
| Int_t | TDecompBase::fColLwb | Column lower bound of decomposed matrix | 
| Double_t | TDecompBase::fCondition | matrix condition number | 
| Double_t | TDecompBase::fDet1 | determinant mantissa | 
| Double_t | TDecompBase::fDet2 | determinant exponent for powers of 2 | 
| Int_t | TDecompBase::fRowLwb | Row lower bound of decomposed matrix | 
| TVectorD | fSig | diagonal of diagonal matrix | 
| Double_t | TDecompBase::fTol | sqrt(epsilon); epsilon is smallest number number so that 1+epsilon > 1 | 
| TMatrixD | fU | orthogonal matrix | 
| TMatrixD | fV | orthogonal matrix | 

Constructor for ([row_lwb..row_upb] x [col_lwb..col_upb]) matrix
SVD decomposition of matrix If the decomposition succeeds, bit kDecomposed is set , otherwise kSingular
Bidiagonalize the (m x n) - matrix a (stored in v) through a series of Householder transformations applied to the left (Q^T) and to the right (H) of a , so that A = Q . C . H^T with matrix C bidiagonal. Q and H are orthogonal matrices . Output: v - (n x n) - matrix H in the (n x n) part of v u - (m x m) - matrix Q^T sDiag - diagonal of the (m x n) C oDiag - off-diagonal elements of matrix C Test code for the output: const Int_t nRow = v.GetNrows(); const Int_t nCol = v.GetNcols(); TMatrixD H(v); H.ResizeTo(nCol,nCol); TMatrixD E1(nCol,nCol); E1.UnitMatrix(); TMatrixD Ht(TMatrixDBase::kTransposed,H); Bool_t ok = kTRUE; ok &= VerifyMatrixIdentity(Ht * H,E1,kTRUE,1.0e-13); ok &= VerifyMatrixIdentity(H * Ht,E1,kTRUE,1.0e-13); TMatrixD E2(nRow,nRow); E2.UnitMatrix(); TMatrixD Qt(u); TMatrixD Q(TMatrixDBase::kTransposed,Qt); ok &= VerifyMatrixIdentity(Q * Qt,E2,kTRUE,1.0e-13); TMatrixD C(nRow,nCol); TMatrixDDiag(C) = sDiag; for (Int_t i = 0; i < nCol-1; i++) C(i,i+1) = oDiag(i+1); TMatrixD A = Q*C*Ht; ok &= VerifyMatrixIdentity(A,a,kTRUE,1.0e-13);
 Diagonalizes in an iterative fashion the bidiagonal matrix C as described through
 sDiag and oDiag, so that S' = U'^T . C . V' is diagonal. U' and V' are orthogonal
 matrices .
 Output:
   v     - (n x n) - matrix H . V' in the (n x n) part of v
   u     - (m x m) - matrix U'^T . Q^T
   sDiag - diagonal of the (m x n) S'
   return convergence flag:  0 -> no convergence
                             1 -> convergence
  Test code for the output:
    const Int_t nRow = v.GetNrows();
    const Int_t nCol = v.GetNcols();
    TMatrixD tmp = v; tmp.ResizeTo(nCol,nCol);
    TMatrixD Vprime  = Ht*tmp;
    TMatrixD Vprimet(TMatrixDBase::kTransposed,Vprime);
    TMatrixD Uprimet = u*Q;
    TMatrixD Uprime(TMatrixDBase::kTransposed,Uprimet);
    TMatrixD Sprime(nRow,nCol);
    TMatrixDDiag(Sprime) = sDiag;
    ok &= VerifyMatrixIdentity(Uprimet * C * Vprime,Sprime,kTRUE,1.0e-13);
    ok &= VerifyMatrixIdentity(Q*Uprime * Sprime * Vprimet * Ht,a,kTRUE,1.0e-13);
Step 1 in the matrix diagonalization
Step 2 in the matrix diagonalization
Step 3 in the matrix diagonalization
Perform a permutation transformation on the diagonal matrix S', so that matrix S'' = U''^T . S' . V'' has diagonal elements ordered such that they do not increase. Output: v - (n x n) - matrix H . V' . V'' in the (n x n) part of v u - (m x m) - matrix U''^T . U'^T . Q^T sDiag - diagonal of the (m x n) S''
Solve Ax=b assuming the SVD form of A is stored . Solution returned in b. If A is of size (m x n), input vector b should be of size (m), however, the solution, returned in b, will be in the first (n) elements . For m > n , x is the least-squares solution of min(A . x - b)
Solve Ax=b assuming the SVD form of A is stored . Solution returned in the matrix column cb b. If A is of size (m x n), input vector b should be of size (m), however, the solution, returned in b, will be in the first (n) elements . For m > n , x is the least-squares solution of min(A . x - b)
Solve A^T x=b assuming the SVD form of A is stored . Solution returned in b.
Solve A^T x=b assuming the SVD form of A is stored . Solution returned in b.
For a matrix A(m,n), its inverse A_inv is defined as A * A_inv = A_inv * A = unit The user should always supply a matrix of size (m x m) ! If m > n , only the (n x m) part of the returned (pseudo inverse) matrix should be used .
For a matrix A(m,n), its inverse A_inv is defined as A * A_inv = A_inv * A = unit (n x m) Ainv is returned .