12 #ifndef ROOT_TMatrixTUtils
13 #define ROOT_TMatrixTUtils
38 #include <initializer_list>
40 template<
class Element>
class TVectorT;
41 template<
class Element>
class TMatrixT;
42 template<
class Element>
class TMatrixTSym;
43 template<
class Element>
class TMatrixTSparse;
56 template<
class Element>
class TElementActionT {
59 friend class TMatrixTBase <Element>;
60 friend class TMatrixT <Element>;
61 friend class TMatrixTSym <Element>;
62 friend class TMatrixTSparse<Element>;
63 friend class TVectorT <Element>;
67 virtual ~TElementActionT() { }
68 virtual void Operation(Element &element)
const = 0;
71 TElementActionT& operator=(
const TElementActionT<Element> &) {
return *
this;}
86 template<
class Element>
class TElementPosActionT {
89 friend class TMatrixTBase <Element>;
90 friend class TMatrixT <Element>;
91 friend class TMatrixTSym <Element>;
92 friend class TMatrixTSparse<Element>;
93 friend class TVectorT <Element>;
99 virtual ~TElementPosActionT() { }
100 virtual void Operation(Element &element)
const = 0;
103 TElementPosActionT<Element>& operator=(
const TElementPosActionT<Element> &) {
return *
this;}
114 template<
class Element>
class TMatrixTRow_const {
117 const TMatrixTBase<Element> *fMatrix;
123 TMatrixTRow_const() { fMatrix = 0; fRowInd = 0; fInc = 0; fPtr = 0; }
124 TMatrixTRow_const(
const TMatrixT <Element> &matrix,Int_t row);
125 TMatrixTRow_const(
const TMatrixTSym<Element> &matrix,Int_t row);
126 TMatrixTRow_const(
const TMatrixTRow_const<Element>& trc):
127 fMatrix(trc.fMatrix), fRowInd(trc.fRowInd), fInc(trc.fInc), fPtr(trc.fPtr) { }
128 TMatrixTRow_const<Element>& operator=(
const TMatrixTRow_const<Element>& trc) {
129 if(
this != &trc) { fMatrix=trc.fMatrix; fRowInd=trc.fRowInd; fInc=trc.fInc; fPtr=trc.fPtr; }
return *
this;}
130 virtual ~TMatrixTRow_const() { }
132 inline const TMatrixTBase<Element> *GetMatrix ()
const {
return fMatrix; }
133 inline Int_t GetRowIndex()
const {
return fRowInd; }
134 inline Int_t GetInc ()
const {
return fInc; }
135 inline const Element *GetPtr ()
const {
return fPtr; }
136 inline const Element &operator ()(Int_t i)
const {
137 if (!fMatrix)
return TMatrixTBase<Element>::NaNValue();
138 R__ASSERT(fMatrix->IsValid());
139 const Int_t acoln = i-fMatrix->GetColLwb();
140 if (acoln < fMatrix->GetNcols() && acoln >= 0)
143 Error(
"operator()",
"Request col(%d) outside matrix range of %d - %d",
144 i,fMatrix->GetColLwb(),fMatrix->GetColLwb()+fMatrix->GetNcols());
145 return TMatrixTBase<Element>::NaNValue();
148 inline const Element &operator [](Int_t i)
const {
return (*(
const TMatrixTRow_const<Element> *)
this)(i); }
150 ClassDef(TMatrixTRow_const,0)
153 template<
class Element>
class TMatrixTRow :
public TMatrixTRow_const<Element> {
157 TMatrixTRow(TMatrixT <Element> &matrix,Int_t row);
158 TMatrixTRow(TMatrixTSym<Element> &matrix,Int_t row);
159 TMatrixTRow(
const TMatrixTRow<Element> &mr);
161 inline Element *GetPtr()
const {
return const_cast<Element *
>(this->fPtr); }
163 inline const Element &operator()(Int_t i)
const {
164 if (!this->fMatrix)
return TMatrixTBase<Element>::NaNValue();
165 R__ASSERT(this->fMatrix->IsValid());
166 const Int_t acoln = i-this->fMatrix->GetColLwb();
167 if (acoln < this->fMatrix->GetNcols() || acoln >= 0)
168 return (this->fPtr)[acoln];
170 Error(
"operator()",
"Request col(%d) outside matrix range of %d - %d",
171 i,this->fMatrix->GetColLwb(),this->fMatrix->GetColLwb()+this->fMatrix->GetNcols());
172 return TMatrixTBase<Element>::NaNValue();
175 inline Element &operator()(Int_t i) {
176 if (!this->fMatrix)
return TMatrixTBase<Element>::NaNValue();
177 R__ASSERT(this->fMatrix->IsValid());
178 const Int_t acoln = i-this->fMatrix->GetColLwb();
179 if (acoln < this->fMatrix->GetNcols() && acoln >= 0)
180 return (const_cast<Element *>(this->fPtr))[acoln];
182 Error(
"operator()",
"Request col(%d) outside matrix range of %d - %d",
183 i,this->fMatrix->GetColLwb(),this->fMatrix->GetColLwb()+this->fMatrix->GetNcols());
185 return TMatrixTBase<Element>::NaNValue();
188 inline const Element &operator[](Int_t i)
const {
return (*(
const TMatrixTRow<Element> *)
this)(i); }
189 inline Element &operator[](Int_t i) {
return (*( TMatrixTRow<Element> *)
this)(i); }
191 void Assign (Element val);
192 void operator= (std::initializer_list<Element> l);
193 void operator+=(Element val);
194 void operator*=(Element val);
196 void operator=(
const TMatrixTRow_const<Element> &r);
197 TMatrixTRow<Element>& operator=(
const TMatrixTRow <Element> &r) { operator=((TMatrixTRow_const<Element> &)r);
return *
this;}
198 void operator=(
const TVectorT <Element> &vec);
200 void operator+=(
const TMatrixTRow_const<Element> &r);
201 void operator*=(
const TMatrixTRow_const<Element> &r);
203 ClassDef(TMatrixTRow,0)
214 template<
class Element>
class TMatrixTColumn_const {
217 const TMatrixTBase<Element> *fMatrix;
223 TMatrixTColumn_const() { fMatrix = 0; fColInd = 0; fInc = 0; fPtr = 0; }
224 TMatrixTColumn_const(
const TMatrixT <Element> &matrix,Int_t col);
225 TMatrixTColumn_const(
const TMatrixTSym<Element> &matrix,Int_t col);
226 TMatrixTColumn_const(
const TMatrixTColumn_const<Element>& trc):
227 fMatrix(trc.fMatrix), fColInd(trc.fColInd), fInc(trc.fInc), fPtr(trc.fPtr) { }
228 TMatrixTColumn_const<Element>& operator=(
const TMatrixTColumn_const<Element>& trc) {
229 if(
this != &trc) { fMatrix=trc.fMatrix; fColInd=trc.fColInd; fInc=trc.fInc; fPtr=trc.fPtr; }
return *
this;}
230 virtual ~TMatrixTColumn_const() { }
232 inline const TMatrixTBase <Element> *GetMatrix ()
const {
return fMatrix; }
233 inline Int_t GetColIndex()
const {
return fColInd; }
234 inline Int_t GetInc ()
const {
return fInc; }
235 inline const Element *GetPtr ()
const {
return fPtr; }
236 inline const Element &operator ()(Int_t i)
const {
237 if (!this->fMatrix)
return TMatrixTBase<Element>::NaNValue();
238 R__ASSERT(fMatrix->IsValid());
239 const Int_t arown = i-fMatrix->GetRowLwb();
240 if (arown < fMatrix->GetNrows() && arown >= 0)
241 return fPtr[arown*fInc];
243 Error(
"operator()",
"Request row(%d) outside matrix range of %d - %d",
244 i,fMatrix->GetRowLwb(),fMatrix->GetRowLwb()+fMatrix->GetNrows());
245 return TMatrixTBase<Element>::NaNValue();
248 inline const Element &operator [](Int_t i)
const {
return (*(
const TMatrixTColumn_const<Element> *)
this)(i); }
250 ClassDef(TMatrixTColumn_const,0)
253 template<
class Element>
class TMatrixTColumn :
public TMatrixTColumn_const<Element> {
257 TMatrixTColumn(TMatrixT <Element>&matrix,Int_t col);
258 TMatrixTColumn(TMatrixTSym<Element>&matrix,Int_t col);
259 TMatrixTColumn(
const TMatrixTColumn <Element>&mc);
261 inline Element *GetPtr()
const {
return const_cast<Element *
>(this->fPtr); }
263 inline const Element &operator()(Int_t i)
const {
264 if (!this->fMatrix)
return TMatrixTBase<Element>::NaNValue();
265 R__ASSERT(this->fMatrix->IsValid());
266 const Int_t arown = i-this->fMatrix->GetRowLwb();
267 if (arown < this->fMatrix->GetNrows() && arown >= 0)
268 return (this->fPtr)[arown*this->fInc];
270 Error(
"operator()",
"Request row(%d) outside matrix range of %d - %d",
271 i,this->fMatrix->GetRowLwb(),this->fMatrix->GetRowLwb()+this->fMatrix->GetNrows());
272 return TMatrixTBase<Element>::NaNValue();
275 inline Element &operator()(Int_t i) {
276 if (!this->fMatrix)
return TMatrixTBase<Element>::NaNValue();
277 R__ASSERT(this->fMatrix->IsValid());
278 const Int_t arown = i-this->fMatrix->GetRowLwb();
280 if (arown < this->fMatrix->GetNrows() && arown >= 0)
281 return (const_cast<Element *>(this->fPtr))[arown*this->fInc];
283 Error(
"operator()",
"Request row(%d) outside matrix range of %d - %d",
284 i,this->fMatrix->GetRowLwb(),this->fMatrix->GetRowLwb()+this->fMatrix->GetNrows());
285 return TMatrixTBase<Element>::NaNValue();
288 inline const Element &operator[](Int_t i)
const {
return (*(
const TMatrixTColumn<Element> *)
this)(i); }
289 inline Element &operator[](Int_t i) {
return (*( TMatrixTColumn<Element> *)
this)(i); }
291 void Assign (Element val);
293 void operator= (Element val) {
return Assign(val); }
294 void operator= (std::initializer_list<Element> l);
295 void operator+=(Element val);
296 void operator*=(Element val);
298 void operator=(
const TMatrixTColumn_const<Element> &c);
299 TMatrixTColumn<Element>& operator=(
const TMatrixTColumn <Element> &c) { operator=((TMatrixTColumn_const<Element> &)c);
return *
this;}
300 void operator=(
const TVectorT <Element> &vec);
302 void operator+=(
const TMatrixTColumn_const<Element> &c);
303 void operator*=(
const TMatrixTColumn_const<Element> &c);
305 ClassDef(TMatrixTColumn,0)
316 template<
class Element>
class TMatrixTDiag_const {
319 const TMatrixTBase<Element> *fMatrix;
325 TMatrixTDiag_const() { fMatrix = 0; fInc = 0; fNdiag = 0; fPtr = 0; }
326 TMatrixTDiag_const(
const TMatrixT <Element> &matrix);
327 TMatrixTDiag_const(
const TMatrixTSym<Element> &matrix);
328 TMatrixTDiag_const(
const TMatrixTDiag_const<Element>& trc):
329 fMatrix(trc.fMatrix), fInc(trc.fInc), fNdiag(trc.fNdiag), fPtr(trc.fPtr) { }
330 TMatrixTDiag_const<Element>& operator=(
const TMatrixTDiag_const<Element>& trc) {
331 if(
this != &trc) { fMatrix=trc.fMatrix; fInc=trc.fInc; fNdiag=trc.fNdiag; fPtr=trc.fPtr; }
return *
this;}
332 virtual ~TMatrixTDiag_const() { }
334 inline const TMatrixTBase<Element> *GetMatrix()
const {
return fMatrix; }
335 inline const Element *GetPtr ()
const {
return fPtr; }
336 inline Int_t GetInc ()
const {
return fInc; }
337 inline const Element &operator ()(Int_t i)
const {
338 R__ASSERT(fMatrix->IsValid());
339 if (i < fNdiag && i >= 0)
342 Error(
"operator()",
"Request diagonal(%d) outside matrix range of 0 - %d",i,fNdiag);
343 return TMatrixTBase<Element>::NaNValue();
346 inline const Element &operator [](Int_t i)
const {
return (*(
const TMatrixTDiag_const<Element> *)
this)(i); }
348 Int_t GetNdiags()
const {
return fNdiag; }
350 ClassDef(TMatrixTDiag_const,0)
353 template<
class Element>
class TMatrixTDiag :
public TMatrixTDiag_const<Element> {
357 TMatrixTDiag(TMatrixT <Element>&matrix);
358 TMatrixTDiag(TMatrixTSym<Element>&matrix);
359 TMatrixTDiag(
const TMatrixTDiag<Element> &md);
361 inline Element *GetPtr()
const {
return const_cast<Element *
>(this->fPtr); }
363 inline const Element &operator()(Int_t i)
const {
364 R__ASSERT(this->fMatrix->IsValid());
365 if (i < this->fNdiag && i >= 0)
366 return (this->fPtr)[i*this->fInc];
368 Error(
"operator()",
"Request diagonal(%d) outside matrix range of 0 - %d",i,this->fNdiag);
369 return TMatrixTBase<Element>::NaNValue();
372 inline Element &operator()(Int_t i) {
373 R__ASSERT(this->fMatrix->IsValid());
374 if (i < this->fNdiag && i >= 0)
375 return (const_cast<Element *>(this->fPtr))[i*this->fInc];
377 Error(
"operator()",
"Request diagonal(%d) outside matrix range of 0 - %d",i,this->fNdiag);
378 return (const_cast<Element *>(this->fPtr))[0];
381 inline const Element &operator[](Int_t i)
const {
return (*(
const TMatrixTDiag<Element> *)
this)(i); }
382 inline Element &operator[](Int_t i) {
return (*( TMatrixTDiag *)
this)(i); }
384 void operator= (Element val);
385 void operator+=(Element val);
386 void operator*=(Element val);
388 void operator=(
const TMatrixTDiag_const<Element> &d);
389 TMatrixTDiag<Element>& operator=(
const TMatrixTDiag <Element> &d) { operator=((TMatrixTDiag_const<Element> &)d);
return *
this;}
390 void operator=(
const TVectorT <Element> &vec);
392 void operator+=(
const TMatrixTDiag_const<Element> &d);
393 void operator*=(
const TMatrixTDiag_const<Element> &d);
395 ClassDef(TMatrixTDiag,0)
406 template<
class Element>
class TMatrixTFlat_const {
409 const TMatrixTBase<Element> *fMatrix;
414 TMatrixTFlat_const() { fMatrix = 0; fNelems = 0; fPtr = 0; }
415 TMatrixTFlat_const(
const TMatrixT <Element> &matrix);
416 TMatrixTFlat_const(
const TMatrixTSym<Element> &matrix);
417 TMatrixTFlat_const(
const TMatrixTFlat_const<Element>& trc):
418 fMatrix(trc.fMatrix), fNelems(trc.fNelems), fPtr(trc.fPtr) { }
419 TMatrixTFlat_const<Element>& operator=(
const TMatrixTFlat_const<Element>& trc) {
420 if(
this != &trc) { fMatrix=trc.fMatrix; fNelems=trc.fNelems; fPtr=trc.fPtr; }
return *
this;}
421 virtual ~TMatrixTFlat_const() { }
423 inline const TMatrixTBase<Element> *GetMatrix()
const {
return fMatrix; }
424 inline const Element *GetPtr ()
const {
return fPtr; }
425 inline const Element &operator ()(Int_t i)
const {
426 R__ASSERT(fMatrix->IsValid());
427 if (i < fNelems && i >= 0)
430 Error(
"operator()",
"Request element(%d) outside matrix range of 0 - %d",i,fNelems);
431 return TMatrixTBase<Element>::NaNValue();
434 inline const Element &operator [](Int_t i)
const {
return (*(
const TMatrixTFlat_const<Element> *)
this)(i); }
436 ClassDef(TMatrixTFlat_const,0)
439 template<
class Element>
class TMatrixTFlat :
public TMatrixTFlat_const<Element> {
443 TMatrixTFlat(TMatrixT <Element> &matrix);
444 TMatrixTFlat(TMatrixTSym<Element> &matrix);
445 TMatrixTFlat(
const TMatrixTFlat<Element> &mf);
447 inline Element *GetPtr()
const {
return const_cast<Element *
>(this->fPtr); }
449 inline const Element &operator()(Int_t i)
const {
450 R__ASSERT(this->fMatrix->IsValid());
451 if (i < this->fNelems && i >= 0)
452 return (this->fPtr)[i];
454 Error(
"operator()",
"Request element(%d) outside matrix range of 0 - %d",i,this->fNelems);
455 return TMatrixTBase<Element>::NaNValue();
458 inline Element &operator()(Int_t i) {
459 R__ASSERT(this->fMatrix->IsValid());
460 if (i < this->fNelems && i >= 0)
461 return (const_cast<Element *>(this->fPtr))[i];
463 Error(
"operator()",
"Request element(%d) outside matrix range of 0 - %d",i,this->fNelems);
464 return TMatrixTBase<Element>::NaNValue();
467 inline const Element &operator[](Int_t i)
const {
return (*(
const TMatrixTFlat<Element> *)
this)(i); }
468 inline Element &operator[](Int_t i) {
return (*( TMatrixTFlat<Element> *)
this)(i); }
470 void operator= (Element val);
471 void operator+=(Element val);
472 void operator*=(Element val);
474 void operator=(
const TMatrixTFlat_const<Element> &f);
475 TMatrixTFlat<Element>& operator=(
const TMatrixTFlat <Element> &f) { operator=((TMatrixTFlat_const<Element> &)f);
return *
this;}
476 void operator=(
const TVectorT <Element> &vec);
478 void operator+=(
const TMatrixTFlat_const<Element> &f);
479 void operator*=(
const TMatrixTFlat_const<Element> &f);
481 ClassDef(TMatrixTFlat,0)
492 template<
class Element>
class TMatrixTSub_const {
495 const TMatrixTBase<Element> *fMatrix;
502 TMatrixTSub_const() { fRowOff = fColOff = fNrowsSub = fNcolsSub = 0; fMatrix = 0; }
503 TMatrixTSub_const(
const TMatrixT <Element> &matrix,Int_t row_lwb,Int_t row_upb,Int_t col_lwb,Int_t col_upb);
504 TMatrixTSub_const(
const TMatrixTSym<Element> &matrix,Int_t row_lwb,Int_t row_upb,Int_t col_lwb,Int_t col_upb);
505 virtual ~TMatrixTSub_const() { }
507 inline const TMatrixTBase<Element> *GetMatrix()
const {
return fMatrix; }
508 inline Int_t GetRowOff()
const {
return fRowOff; }
509 inline Int_t GetColOff()
const {
return fColOff; }
510 inline Int_t GetNrows ()
const {
return fNrowsSub; }
511 inline Int_t GetNcols ()
const {
return fNcolsSub; }
512 inline const Element &operator ()(Int_t rown,Int_t coln)
const {
513 R__ASSERT(fMatrix->IsValid());
515 const Element *ptr = fMatrix->GetMatrixArray();
516 if (rown >= fNrowsSub || rown < 0) {
517 Error(
"operator()",
"Request row(%d) outside matrix range of 0 - %d",rown,fNrowsSub);
518 return TMatrixTBase<Element>::NaNValue();
520 if (coln >= fNcolsSub || coln < 0) {
521 Error(
"operator()",
"Request column(%d) outside matrix range of 0 - %d",coln,fNcolsSub);
522 return TMatrixTBase<Element>::NaNValue();
524 const Int_t index = (rown+fRowOff)*fMatrix->GetNcols()+coln+fColOff;
528 ClassDef(TMatrixTSub_const,0)
531 template<
class Element>
class TMatrixTSub :
public TMatrixTSub_const<Element> {
535 enum {kWorkMax = 100};
538 TMatrixTSub(TMatrixT <Element> &matrix,Int_t row_lwb,Int_t row_upb,Int_t col_lwb,Int_t col_upb);
539 TMatrixTSub(TMatrixTSym<Element> &matrix,Int_t row_lwb,Int_t row_upb,Int_t col_lwb,Int_t col_upb);
540 TMatrixTSub(
const TMatrixTSub<Element> &ms);
542 inline Element &operator()(Int_t rown,Int_t coln) {
543 R__ASSERT(this->fMatrix->IsValid());
545 const Element *ptr = this->fMatrix->GetMatrixArray();
546 if (rown >= this->fNrowsSub || rown < 0) {
547 Error(
"operator()",
"Request row(%d) outside matrix range of 0 - %d",rown,this->fNrowsSub);
548 return TMatrixTBase<Element>::NaNValue();
550 if (coln >= this->fNcolsSub || coln < 0) {
551 Error(
"operator()",
"Request column(%d) outside matrix range of 0 - %d",coln,this->fNcolsSub);
552 return TMatrixTBase<Element>::NaNValue();
554 const Int_t index = (rown+this->fRowOff)*this->fMatrix->GetNcols()+coln+this->fColOff;
555 return (const_cast<Element *>(ptr))[index];
558 void Rank1Update(
const TVectorT<Element> &vec,Element alpha=1.0);
560 void operator= (Element val);
561 void operator+=(Element val);
562 void operator*=(Element val);
564 void operator=(
const TMatrixTSub_const<Element> &s);
565 TMatrixTSub<Element>& operator=(
const TMatrixTSub <Element> &s) { operator=((TMatrixTSub_const<Element> &)s);
return *
this;}
566 void operator=(
const TMatrixTBase <Element> &m);
568 void operator+=(
const TMatrixTSub_const<Element> &s);
569 void operator*=(
const TMatrixTSub_const<Element> &s);
570 void operator+=(
const TMatrixTBase <Element> &m);
571 void operator*=(
const TMatrixT <Element> &m);
572 void operator*=(
const TMatrixTSym <Element> &m);
574 ClassDef(TMatrixTSub,0)
585 template<
class Element>
class TMatrixTSparseRow_const {
588 const TMatrixTSparse<Element> *fMatrix;
591 const Int_t *fColPtr;
592 const Element *fDataPtr;
595 TMatrixTSparseRow_const() { fMatrix = 0; fRowInd = 0; fNindex = 0; fColPtr = 0; fDataPtr = 0; }
596 TMatrixTSparseRow_const(
const TMatrixTSparse<Element> &matrix,Int_t row);
597 TMatrixTSparseRow_const(
const TMatrixTSparseRow_const<Element>& trc):
598 fMatrix(trc.fMatrix), fRowInd(trc.fRowInd), fNindex(trc.fNindex), fColPtr(trc.fColPtr), fDataPtr(trc.fDataPtr) { }
599 TMatrixTSparseRow_const<Element>& operator=(
const TMatrixTSparseRow_const<Element>& trc) {
600 if(
this != &trc) { fMatrix=trc.fMatrix; fRowInd=trc.fRowInd; fNindex=trc.fNindex; fColPtr=trc.fColPtr; fDataPtr=trc.fDataPtr; }
return *
this;}
601 virtual ~TMatrixTSparseRow_const() { }
603 inline const TMatrixTBase<Element> *GetMatrix ()
const {
return fMatrix; }
604 inline const Element *GetDataPtr ()
const {
return fDataPtr; }
605 inline const Int_t *GetColPtr ()
const {
return fColPtr; }
606 inline Int_t GetRowIndex()
const {
return fRowInd; }
607 inline Int_t GetNindex ()
const {
return fNindex; }
609 Element operator()(Int_t i)
const;
610 inline Element operator[](Int_t i)
const {
return (*(
const TMatrixTSparseRow_const<Element> *)
this)(i); }
612 ClassDef(TMatrixTSparseRow_const,0)
615 template<
class Element>
class TMatrixTSparseRow :
public TMatrixTSparseRow_const<Element> {
618 TMatrixTSparseRow() {}
619 TMatrixTSparseRow(TMatrixTSparse<Element> &matrix,Int_t row);
620 TMatrixTSparseRow(
const TMatrixTSparseRow<Element> &mr);
622 inline Element *GetDataPtr()
const {
return const_cast<Element *
>(this->fDataPtr); }
624 Element operator()(Int_t i)
const;
625 Element &operator()(Int_t i);
626 inline Element operator[](Int_t i)
const {
return (*(
const TMatrixTSparseRow<Element> *)
this)(i); }
627 inline Element &operator[](Int_t i) {
return (*(TMatrixTSparseRow<Element> *)
this)(i); }
629 void operator= (Element val);
630 void operator+=(Element val);
631 void operator*=(Element val);
633 void operator=(
const TMatrixTSparseRow_const<Element> &r);
634 TMatrixTSparseRow<Element>& operator=(
const TMatrixTSparseRow <Element> &r) { operator=((TMatrixTSparseRow_const<Element> &)r);
return *
this;}
635 void operator=(
const TVectorT <Element> &vec);
637 void operator+=(
const TMatrixTSparseRow_const<Element> &r);
638 void operator*=(
const TMatrixTSparseRow_const<Element> &r);
640 ClassDef(TMatrixTSparseRow,0)
651 template<
class Element>
class TMatrixTSparseDiag_const {
654 const TMatrixTSparse<Element> *fMatrix;
656 const Element *fDataPtr;
659 TMatrixTSparseDiag_const() { fMatrix = 0; fNdiag = 0; fDataPtr = 0; }
660 TMatrixTSparseDiag_const(
const TMatrixTSparse<Element> &matrix);
661 TMatrixTSparseDiag_const(
const TMatrixTSparseDiag_const<Element>& trc):
662 fMatrix(trc.fMatrix), fNdiag(trc.fNdiag), fDataPtr(trc.fDataPtr) { }
663 TMatrixTSparseDiag_const<Element>& operator=(
const TMatrixTSparseDiag_const<Element>& trc) {
664 if(
this != &trc) { fMatrix=trc.fMatrix; fNdiag=trc.fNdiag; fDataPtr=trc.fDataPtr; }
return *
this;}
665 virtual ~TMatrixTSparseDiag_const() { }
667 inline const TMatrixTBase<Element> *GetMatrix ()
const {
return fMatrix; }
668 inline const Element *GetDataPtr()
const {
return fDataPtr; }
669 inline Int_t GetNdiags ()
const {
return fNdiag; }
671 Element operator ()(Int_t i)
const;
672 inline Element operator [](Int_t i)
const {
return (*(
const TMatrixTSparseRow_const<Element> *)
this)(i); }
674 ClassDef(TMatrixTSparseDiag_const,0)
677 template<
class Element>
class TMatrixTSparseDiag :
public TMatrixTSparseDiag_const<Element> {
680 TMatrixTSparseDiag() {}
681 TMatrixTSparseDiag(TMatrixTSparse<Element> &matrix);
682 TMatrixTSparseDiag(
const TMatrixTSparseDiag<Element> &md);
684 inline Element *GetDataPtr()
const {
return const_cast<Element *
>(this->fDataPtr); }
686 Element operator()(Int_t i)
const;
687 Element &operator()(Int_t i);
688 inline Element operator[](Int_t i)
const {
return (*(
const TMatrixTSparseDiag<Element> *)
this)(i); }
689 inline Element &operator[](Int_t i) {
return (*(TMatrixTSparseDiag<Element> *)
this)(i); }
691 void operator= (Element val);
692 void operator+=(Element val);
693 void operator*=(Element val);
695 void operator=(
const TMatrixTSparseDiag_const<Element> &d);
696 TMatrixTSparseDiag<Element>& operator=(
const TMatrixTSparseDiag <Element> &d) { operator=((TMatrixTSparseDiag_const<Element> &)d);
return *
this;}
697 void operator=(
const TVectorT <Element> &vec);
699 void operator+=(
const TMatrixTSparseDiag_const<Element> &d);
700 void operator*=(
const TMatrixTSparseDiag_const<Element> &d);
702 ClassDef(TMatrixTSparseDiag,0)
705 Double_t Drand(Double_t &ix);