Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TDecompSVD.h
Go to the documentation of this file.
1 // @(#)root/matrix:$Id$
2 // Authors: Fons Rademakers, Eddy Offermann Dec 2003
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TDecompSVD
13 #define ROOT_TDecompSVD
14 
15 ///////////////////////////////////////////////////////////////////////////
16 // //
17 // Single Value Decomposition class //
18 // //
19 ///////////////////////////////////////////////////////////////////////////
20 
21 #include "TDecompBase.h"
22 
23 class TDecompSVD : public TDecompBase
24 {
25 protected :
26 
27  // A = fU fSig fV^T
28  TMatrixD fU; // orthogonal matrix
29  TMatrixD fV; // orthogonal matrix
30  TVectorD fSig; // diagonal of diagonal matrix
31 
32  static Bool_t Bidiagonalize(TMatrixD &v,TMatrixD &u,TVectorD &sDiag,TVectorD &oDiag);
33  static Bool_t Diagonalize (TMatrixD &v,TMatrixD &u,TVectorD &sDiag,TVectorD &oDiag);
34  static void Diag_1 (TMatrixD &v,TVectorD &sDiag,TVectorD &oDiag,Int_t k);
35  static void Diag_2 (TVectorD &sDiag,TVectorD &oDiag,Int_t k,Int_t l);
36  static void Diag_3 (TMatrixD &v,TMatrixD &u,TVectorD &sDiag,TVectorD &oDiag,Int_t k,Int_t l);
37  static void SortSingular (TMatrixD &v,TMatrixD &u,TVectorD &sDiag);
38 
39  virtual const TMatrixDBase &GetDecompMatrix() const { return fU; }
40 
41 public :
42 
43  enum {kWorkMax = 100}; // size of work array
44 
45  TDecompSVD(): fU(), fV(), fSig() {}
46  TDecompSVD(Int_t nrows,Int_t ncols);
47  TDecompSVD(Int_t row_lwb,Int_t row_upb,Int_t col_lwb,Int_t col_upb);
48  TDecompSVD(const TMatrixD &m,Double_t tol = 0.0);
49  TDecompSVD(const TDecompSVD &another);
50  virtual ~TDecompSVD() {}
51 
52  const TMatrixD GetMatrix ();
53  virtual Int_t GetNrows () const;
54  virtual Int_t GetNcols () const;
55  const TMatrixD &GetU () { if ( !TestBit(kDecomposed) ) Decompose();
56  return fU; }
57  const TMatrixD &GetV () { if ( !TestBit(kDecomposed) ) Decompose();
58  return fV; }
59  const TVectorD &GetSig () { if ( !TestBit(kDecomposed) ) Decompose();
60  return fSig; }
61 
62  virtual void SetMatrix (const TMatrixD &a);
63 
64  virtual Bool_t Decompose ();
65  virtual Bool_t Solve ( TVectorD &b);
66  virtual TVectorD Solve (const TVectorD& b,Bool_t &ok) { TVectorD x = b; ok = Solve(x);
67  const Int_t rowLwb = GetRowLwb();
68  x.ResizeTo(rowLwb,rowLwb+GetNcols()-1);
69  return x; }
70  virtual Bool_t Solve ( TMatrixDColumn &b);
71  virtual Bool_t TransSolve ( TVectorD &b);
72  virtual TVectorD TransSolve (const TVectorD& b,Bool_t &ok) { TVectorD x = b; ok = TransSolve(x);
73  const Int_t rowLwb = GetRowLwb();
74  x.ResizeTo(rowLwb,rowLwb+GetNcols()-1);
75  return x; }
76  virtual Bool_t TransSolve ( TMatrixDColumn &b);
77  virtual Double_t Condition ();
78  virtual void Det (Double_t &d1,Double_t &d2);
79 
80  Bool_t Invert (TMatrixD &inv);
81  TMatrixD Invert (Bool_t &status);
82  TMatrixD Invert () {Bool_t status; return Invert(status); }
83 
84  void Print(Option_t *opt ="") const; // *MENU*
85 
86  TDecompSVD &operator= (const TDecompSVD &source);
87 
88  ClassDef(TDecompSVD,1) // Matrix Decompositition SVD
89 };
90 
91 #endif