CLHEP 2.4.7.1
C++ Class Library for High Energy Physics
SymMatrix.icc
Go to the documentation of this file.
1// -*- C++ -*-
2// ---------------------------------------------------------------------------
3//
4// This file is a part of the CLHEP - a Class Library for High Energy Physics.
5//
6// This is the definitions of the inline member functions of the
7// HepSymMatrix class
8//
9#include <stdexcept>
10namespace CLHEP {
11
13 : m(0), nrow(0), size_(0)
14{}
15
16inline int HepSymMatrix::num_row() const { return nrow;}
17inline int HepSymMatrix::num_col() const { return nrow;}
18inline int HepSymMatrix::num_size() const { return size_;}
19
20inline double & HepSymMatrix::fast(int row,int col)
21{
22#ifdef MATRIX_BOUND_CHECK
23 if(row<1||row>num_row() || col<1||col>num_col())
24 error("Range error in HepSymMatrix::fast()");
25#endif
26 return *(m.begin()+(row*(row-1))/2+(col-1));
27}
28inline const double & HepSymMatrix::fast(int row,int col) const
29{
30#ifdef MATRIX_BOUND_CHECK
31 if(row<1||row>num_row() || col<1||col>num_col())
32 error("Range error in HepSymMatrix::fast()");
33#endif
34 return *(m.begin()+(row*(row-1))/2+(col-1));
35}
36
37inline double & HepSymMatrix::operator()(int row, int col)
38 {return (row>=col? fast(row,col) : fast(col,row));}
39inline const double & HepSymMatrix::operator()(int row, int col) const
40 {return (row>=col? fast(row,col) : fast(col,row));}
41
42inline void HepSymMatrix::assign(const HepSymMatrix &hm2)
43 {(*this)=hm2;}
44
45inline HepSymMatrix HepSymMatrix::T() const {return HepSymMatrix(*this);}
46
48#ifdef HEP_GNU_OPTIMIZED_RETURN
49 return b(*this,r);
50{
51#else
52{
53 HepSymMatrix_row b(*this,r);
54#endif
55 return b;
56}
57
59#ifdef HEP_GNU_OPTIMIZED_RETURN
60 return b(*this,r);
61{
62#else
63{
64 const HepSymMatrix_row_const b(*this,r);
65#endif
66 return b;
67}
68
70{
71#ifdef MATRIX_BOUND_CHECK
72 if(_r<0||_r>=_a.nrow || c<0||c>=_a.nrow)
73 error("Range error in HepSymMatrix::operator[][]");
74#endif
75 if (_r >= c ) {
76 return *(_a.m.begin() + (_r+1)*_r/2 + c);
77 } else {
78 return *(_a.m.begin() + (c+1)*c/2 + _r);
79 }
80}
81
82inline const double &
84{
85#ifdef MATRIX_BOUND_CHECK
86 if(_r<0||_r>=_a.nrow || c<0||c>=_a.nrow)
87 error("Range error in HepSymMatrix::operator[][]");
88#endif
89 if (_r >= c ) {
90 return *(_a.m.begin() + (_r+1)*_r/2 + c);
91 } else {
92 return *(_a.m.begin() + (c+1)*c/2 + _r);
93 }
94}
95
97 int r)
98 : _a(a), _r(r)
99{}
100
102(const HepSymMatrix&a,int r)
103 : _a(a), _r(r)
104{}
105
106inline HepSymMatrix HepSymMatrix::inverse(int &ifail) const
107#ifdef HEP_GNU_OPTIMIZED_RETURN
108 return mTmp(*this);
109{
110#else
111{
112 HepSymMatrix mTmp(*this);
113#endif
114 mTmp.invert(ifail);
115 return mTmp;
116}
117
119 int ierr;
120 HepSymMatrix mt=inverse(ierr);
121 if (ierr) throw std::runtime_error("Error in HepSymMatrix inversion");
122 return mt;
123}
124
125inline void HepSymMatrix::invert() {
126 int ierr;
127 invert(ierr);
128 if (ierr) throw std::runtime_error("Error in HepSymMatrix inversion");
129}
130
131} // namespace CLHEP
132
133
static void error(const char *s)
HepSymMatrix_row_const(const HepSymMatrix &, int)
HepSymMatrix_row(HepSymMatrix &, int)
Definition SymMatrix.icc:96
HepSymMatrix_row operator[](int)
Definition SymMatrix.icc:47
int num_row() const
Definition SymMatrix.icc:16
int num_col() const
Definition SymMatrix.icc:17
void assign(const HepMatrix &hm2)
int num_size() const
Definition SymMatrix.icc:18
HepSymMatrix T() const
Definition SymMatrix.icc:45
const double & operator()(int row, int col) const
Definition SymMatrix.icc:39
const double & fast(int row, int col) const
Definition SymMatrix.icc:28
HepSymMatrix inverse() const