12 #ifndef ROOT_TMatrixTBase
13 #define ROOT_TMatrixTBase
79 template<
class Element>
class TVectorT;
80 template<
class Element>
class TElementActionT;
81 template<
class Element>
class TElementPosActionT;
83 R__EXTERN Int_t gMatrixCheck;
85 template<
class Element>
class TMatrixTBase :
public TObject {
88 Element *GetElements();
103 static void DoubleLexSort (Int_t n,Int_t *first,Int_t *second,Element *data);
104 static void IndexedLexSort(Int_t n,Int_t *first,Int_t swapFirst,
105 Int_t *second,Int_t swapSecond,Int_t *index);
107 enum {kSizeMax = 25};
108 enum {kWorkMax = 100};
110 enum EMatrixStatusBits {
117 fNrows(0), fNcols(0), fRowLwb(0), fColLwb(0), fNelems(0), fNrowIndex(0),
118 fTol(0), fIsOwner(kTRUE) { }
120 virtual ~TMatrixTBase() {}
122 inline Int_t GetRowLwb ()
const {
return fRowLwb; }
123 inline Int_t GetRowUpb ()
const {
return fNrows+fRowLwb-1; }
124 inline Int_t GetNrows ()
const {
return fNrows; }
125 inline Int_t GetColLwb ()
const {
return fColLwb; }
126 inline Int_t GetColUpb ()
const {
return fNcols+fColLwb-1; }
127 inline Int_t GetNcols ()
const {
return fNcols; }
128 inline Int_t GetNoElements ()
const {
return fNelems; }
129 inline Element GetTol ()
const {
return fTol; }
131 virtual const Element *GetMatrixArray ()
const = 0;
132 virtual Element *GetMatrixArray () = 0;
133 virtual const Int_t *GetRowIndexArray()
const = 0;
134 virtual Int_t *GetRowIndexArray() = 0;
135 virtual const Int_t *GetColIndexArray()
const = 0;
136 virtual Int_t *GetColIndexArray() = 0;
138 virtual TMatrixTBase<Element> &SetRowIndexArray(Int_t *data) = 0;
139 virtual TMatrixTBase<Element> &SetColIndexArray(Int_t *data) = 0;
140 virtual TMatrixTBase<Element> &SetMatrixArray (
const Element *data,Option_t *option=
"");
141 inline Element SetTol (Element tol);
143 virtual void Clear (Option_t *option=
"") = 0;
145 inline void Invalidate () { SetBit(kStatus); }
146 inline void MakeValid () { ResetBit(kStatus); }
147 inline Bool_t IsValid ()
const {
return !TestBit(kStatus); }
148 inline Bool_t IsOwner ()
const {
return fIsOwner; }
149 virtual Bool_t IsSymmetric()
const;
151 virtual TMatrixTBase<Element> &GetSub(Int_t row_lwb,Int_t row_upb,Int_t col_lwb,Int_t col_upb,
152 TMatrixTBase<Element> &target,Option_t *option=
"S")
const = 0;
153 virtual TMatrixTBase<Element> &SetSub(Int_t row_lwb,Int_t col_lwb,
const TMatrixTBase<Element> &source) = 0;
155 virtual void GetMatrix2Array(Element *data,Option_t *option=
"")
const;
156 virtual TMatrixTBase<Element> &InsertRow (Int_t row,Int_t col,
const Element *v,Int_t n = -1);
157 virtual void ExtractRow (Int_t row,Int_t col, Element *v,Int_t n = -1)
const;
159 virtual TMatrixTBase<Element> &Shift (Int_t row_shift,Int_t col_shift);
160 virtual TMatrixTBase<Element> &ResizeTo (Int_t nrows,Int_t ncols,Int_t nr_nonzeros=-1) = 0;
161 virtual TMatrixTBase<Element> &ResizeTo (Int_t row_lwb,Int_t row_upb,Int_t col_lwb,Int_t col_upb,Int_t nr_nonzeros=-1) = 0;
163 virtual Double_t Determinant()
const { AbstractMethod(
"Determinant()");
return 0.; }
164 virtual void Determinant(Double_t &d1,Double_t &d2)
const { AbstractMethod(
"Determinant()"); d1 = 0.; d2 = 0.; }
166 virtual TMatrixTBase<Element> &Zero ();
167 virtual TMatrixTBase<Element> &Abs ();
168 virtual TMatrixTBase<Element> &Sqr ();
169 virtual TMatrixTBase<Element> &Sqrt ();
170 virtual TMatrixTBase<Element> &UnitMatrix ();
172 virtual TMatrixTBase<Element> &NormByDiag (
const TVectorT<Element> &v,Option_t *option=
"D");
174 virtual Element RowNorm ()
const;
175 virtual Element ColNorm ()
const;
176 virtual Element E2Norm ()
const;
177 inline Element NormInf ()
const {
return RowNorm(); }
178 inline Element Norm1 ()
const {
return ColNorm(); }
179 virtual Int_t NonZeros ()
const;
180 virtual Element Sum ()
const;
181 virtual Element Min ()
const;
182 virtual Element Max ()
const;
184 void Draw (Option_t *option=
"");
185 void Print(Option_t *name =
"")
const;
187 virtual Element operator()(Int_t rown,Int_t coln)
const = 0;
188 virtual Element &operator()(Int_t rown,Int_t coln) = 0;
190 Bool_t operator==(Element val)
const;
191 Bool_t operator!=(Element val)
const;
192 Bool_t operator< (Element val)
const;
193 Bool_t operator<=(Element val)
const;
194 Bool_t operator> (Element val)
const;
195 Bool_t operator>=(Element val)
const;
197 virtual TMatrixTBase<Element> &Apply(
const TElementActionT<Element> &action);
198 virtual TMatrixTBase<Element> &Apply(
const TElementPosActionT<Element> &action);
200 virtual TMatrixTBase<Element> &Randomize(Element alpha,Element beta,Double_t &seed);
203 static Element & NaNValue();
205 ClassDef(TMatrixTBase,5)
216 template <> TClass *TMatrixTBase<double>::Class();
220 template<
class Element> Element TMatrixTBase<Element>::SetTol(Element newTol)
222 const Element oldTol = fTol;
228 template<
class Element> Bool_t operator== (
const TMatrixTBase<Element> &m1,
const TMatrixTBase<Element> &m2);
229 template<
class Element> Element E2Norm (
const TMatrixTBase<Element> &m1,
const TMatrixTBase<Element> &m2);
230 template<
class Element1,
class Element2>
231 Bool_t AreCompatible(
const TMatrixTBase<Element1> &m1,
const TMatrixTBase<Element2> &m2,Int_t verbose=0);
232 template<
class Element>
void Compare (
const TMatrixTBase<Element> &m1,
const TMatrixTBase<Element> &m2);
237 template<
class Element> Bool_t VerifyMatrixValue (
const TMatrixTBase<Element> &m,Element val,
238 Int_t verbose,Element maxDevAllow);
239 template<
class Element> Bool_t VerifyMatrixValue (
const TMatrixTBase<Element> &m,Element val,Int_t verbose)
240 {
return VerifyMatrixValue(m,val,verbose,Element(0.)); }
241 template<
class Element> Bool_t VerifyMatrixValue (
const TMatrixTBase<Element> &m,Element val)
242 {
return VerifyMatrixValue(m,val,1,Element(0.)); }
243 template<
class Element> Bool_t VerifyMatrixIdentity(
const TMatrixTBase<Element> &m1,
const TMatrixTBase<Element> &m2,
244 Int_t verbose,Element maxDevAllow);
245 template<
class Element> Bool_t VerifyMatrixIdentity(
const TMatrixTBase<Element> &m1,
const TMatrixTBase<Element> &m2,Int_t verbose)
246 {
return VerifyMatrixIdentity(m1,m2,verbose,Element(0.)); }
247 template<
class Element> Bool_t VerifyMatrixIdentity(
const TMatrixTBase<Element> &m1,
const TMatrixTBase<Element> &m2)
248 {
return VerifyMatrixIdentity(m1,m2,1,Element(0.)); }