StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
TRSymMatrix.h
1 #ifndef ROOT_TRSymMatrix
2 #define ROOT_TRSymMatrix
3 #include "TRArray.h"
4 #include <assert.h>
5 class TRMatrix;
6 class TRVector;
7 class TDiagMatrix;
8 class TRSymMatrix : public TRArray {
9  public:
10  TRSymMatrix(Int_t nrows=0) : TRArray(nrows*(nrows+1)/2), fNrows(nrows) {}
11  TRSymMatrix(Int_t nrows,const Double_t *Array);
12  TRSymMatrix(Int_t nrows,const Float_t *Array);
13  TRSymMatrix(Int_t nrows,const Char_t *s);
14  TRSymMatrix(const TRSymMatrix& W,ETRMatrixCreatorsOp kop);
15  TRSymMatrix(ETRMatrixCreatorsOp kop,Int_t nrows);
16  TRSymMatrix(const TRMatrix& A);
17  TRSymMatrix(const TRMatrix& A,ETRMatrixCreatorsOp kop,const TRSymMatrix& S);
18  TRSymMatrix(const TRSymMatrix& Q,ETRMatrixCreatorsOp kop,const TRSymMatrix& T);
19  TRSymMatrix(const TRMatrix& A,ETRMatrixCreatorsOp kop);
20 #ifndef __CINT__
21  TRSymMatrix (Int_t nrows, Double_t a0, ...);
22 #endif
23  virtual ~TRSymMatrix() {}
24  void Inverse() { TCL::trsinv(fArray,fArray, fNrows);}
25  Int_t GetNrows() const {return fNrows;}
26  Int_t GetNcols() const {return GetNrows();}
27  virtual ETRMatrixType GetMatrixType() const {return kSemiPosDefinedSymMatrix;}
28  virtual Double_t Product(const TRVector& A,ETRMatrixCreatorsOp kop=kAxSxAT);
29  virtual Int_t SpmInv(const TRSymMatrix &S, TRVector *B = 0);
30  static Int_t spminv(Double_t *v, Double_t *b, Int_t n,
31  Int_t &nrank, Double_t *diag, Bool_t *flag);
32  virtual void Print(Option_t *opt="") const;
33  Double_t &operator()(Int_t i) {return TRArray::operator[](i);}
34  Double_t operator()(Int_t i) const {return TRArray::operator[](i);}
35  Double_t &operator()(Int_t i,Int_t j);
36  Double_t operator()(Int_t i,Int_t j) const;
37  void AddRow(const Double_t *row) {
38  fNrows++; Set(fNrows*(fNrows+1)/2); memcpy(fArray+(fNrows-1)*fNrows/2, row, fNrows*sizeof(Double_t));
39  }
40  void AddRow(const Double_t row) {//Diagonal element only
41  fNrows++; Set(fNrows*(fNrows+1)/2); fArray[(fNrows+1)*fNrows/2-1] = row;
42  }
43  static Int_t TrsInv(const Double_t *g, Double_t *gi, Int_t n);
44  static Int_t TrInv(const Double_t *g, Double_t *gi, Int_t n);
45  static Int_t TrchLU(const Double_t *g, Double_t *gi, Int_t n);
46  static Int_t TrsmUL(const Double_t *g, Double_t *gi, Int_t n);
47  protected:
48  Int_t fNrows; // number of rows
49  public:
50  ClassDef(TRSymMatrix,1) // TRSymMatrix class (double precision)
51 };
52 std::ostream& operator<<(std::ostream& s,const TRSymMatrix &target);
53 inline Double_t &TRSymMatrix::operator()(Int_t i,Int_t j){
54  // assert(! (j < 0 || j >= fNrows));
55  if (j < 0 || j >= fNrows) {
56  ::Error("TRSymMatrix::operator()", "index j %d out of bounds (size: %d, this: %p)",
57  j, fNrows, this);
58  j = 0;
59  assert(0);
60  }
61  // assert(! (i < 0 || i >= fNrows));
62  if (i < 0 || i >= fNrows) {
63  ::Error("TRSymMatrix::operator()", "index i %d out of bounds (size: %d, this: %p)",
64  i, fNrows, this);
65  i = 0;
66  assert(0);
67  }
68  Int_t m = i;
69  Int_t l = j;
70  if (i > j) {m = j; l = i;}
71  return TArrayD::operator[](m + (l+1)*l/2);
72 }
73 inline Double_t TRSymMatrix::operator()(Int_t i,Int_t j) const {
74  // assert(! (j < 0 || j >= fNrows));
75  if (j < 0 || j >= fNrows) {
76  ::Error("TRSymMatrix::operator()", "index j %d out of bounds (size: %d, this: %p)",
77  j, fNrows, this);
78  j = 0;
79  assert(0);
80  }
81  // assert(! (i < 0 || i >= fNrows));
82  if (i < 0 || i >= fNrows) {
83  ::Error("TRSymMatrix::operator()", "index i %d out of bounds (size: %d, this: %p)",
84  i, fNrows, this);
85  i = 0;
86  assert(0);
87  }
88  Int_t m = i;
89  Int_t l = j;
90  if (i > j) {m = j; l = i;}
91  return TArrayD::operator[](m + (l+1)*l/2);
92 }
93 #endif
94 
Definition: FJcore.h:367
static float * trsinv(const float *g, float *gi, int n)
Definition: TCernLib.cxx:1160