Diana Software
QMatrixC.hh
Go to the documentation of this file.
1 
10 #ifndef __QMATRIXC_HH_
11 #define __QMATRIXC_HH_
12 
13 
14 #include <gsl/gsl_complex.h>
15 #include <gsl/gsl_matrix_complex_double.h>
16 #include <map>
17 #include <iostream>
18 #include <sstream>
19 #include <QObject.hh>
20 #include <QMatrix.hh>
21 #include <QComplex.hh>
22 
24 
25 class QVectorC;
26 
27 class QMatrixC : public QObject {
28 public:
32  QMatrixC() ;
38  explicit QMatrixC(const UInt_t nrow,const UInt_t ncol);
43  explicit QMatrixC(const QVectorC& vec);
48  QMatrixC(const QMatrixC& orig);
53  QMatrixC(const QMatrix& orig);
54 
58  virtual ~QMatrixC();
65  void Resize(const UInt_t nrow,const UInt_t ncol);
67  UInt_t Size() const { return fSize/2; };
68 
69 
70  void BuildTest(UInt_t nI,UInt_t nJ) {
71  Resize(nI,nJ);
72  for(UInt_t i=0;i<nI;i++){
73  for(UInt_t j=i;j<nJ;j++){
74  (*this)(i,j)=QComplex(10*(i+j)*(i+j)+1,3.*(1.*i-1.*j));
75  (*this)(j,i)=(*this)(i,j).Conj();
76  if(i==j)
77  (*this)(i,j)+=1000;
78  }
79  }
80  }
81 
82  void Clear();
87  inline UInt_t GetNRow() const {return fNCol ? fSize/(fNCol*2) : 0;};
92  inline UInt_t GetNCol() const {return fNCol;};
97  void Initialize(const QComplex& val);
102  void Initialize(const double re=0,const double im=0){Initialize(QComplex(re,im));};
106  void SetToIdentity();
112  void SetCol(const UInt_t ncol,const QVectorC& vec);
118  void SetRow(const UInt_t nrow,const QVectorC& vec);
124  //ma che e' ao
125  // void Set(const std::map<int,int>& p);
131  QVectorC GetCol(const UInt_t ncol) const;
137  QVectorC GetRow(const UInt_t nrow) const;
142  QVectorC GetDiagonal() const;
143 
152  // QVectorC GetRowByColumnIntValue(int col,int val) const;
159  QComplex operator()(const UInt_t i,const UInt_t j);
168  const QComplex operator() (const UInt_t i,const UInt_t j) const;
174  const QMatrixC& operator=(const QMatrixC& orig);
178  QMatrixC operator-() const;
184  const QMatrixC& operator*=(const QComplex& t);
185  const QMatrixC& operator*=(const double t);
193  const QMatrixC & operator*=(const QMatrixC& other);
199  const QMatrixC & operator/=(const QComplex& t);
200  const QMatrixC& operator/=(const double t);
206  const QMatrixC & operator+=(const QMatrixC& mat);
212  const QMatrixC & operator-=(const QMatrixC& mat);
220  const QMatrixC& Mult(const QMatrixC& mat);
228  const QMatrixC& Div(const QMatrixC& mat);
229 
235  QMatrixC operator*(const QMatrixC& mat) const;
241  QMatrixC operator*(const QComplex& t) const;
242  QMatrixC operator*(const double t) const;
248  QMatrixC operator/(const QComplex& t) const;
249  QMatrixC operator/(const double t) const;
255  QMatrixC operator+(const QMatrixC& mat) const;
261  QMatrixC operator-(const QMatrixC& mat) const;
267  QVectorC operator*(const QVectorC& vec) const;
272  QMatrixC T() const; // returns a different matrix transposed wrt the original
282  const QMatrixC &Transpose(); // transposes the matrix itself
292  const QMatrixC & H();
298  QMatrixC GetH() const;
302  const QMatrixC &Conjugate();
303 
305  QMatrixC GetConjugate() const;
306 
308  QMatrix Magnitude() const;
309 
314  QMatrixC Inv() const; // returns a different matrix inverted wrt the original
319  const QMatrixC &Invert(); // inverts the matrix itself
324  QComplex Det() const;
325 
339 
357  void HermitianEigenSystem(QVector &Val,QMatrixC &Vec);
358 
377  virtual const QMatrixC &CholeskyDecompose();
378 
384  virtual QMatrixC GetCholeskyDecomposition() const;
388  // QMatrixC GetCholeskyInverse() const;
389 
391  // QMatrixC &CholeskyInvert();
392 
401  virtual void CholeskySolveX(const QVectorC &Y,QVectorC &X) const;
408  QMatrixC GetSubMatrix(UInt_t nI,UInt_t nJ,UInt_t startI=0,UInt_t startJ=0);
409 
416  const QMatrixC GetSubMatrix(UInt_t nI,UInt_t nJ,UInt_t startI=0,
417  UInt_t startJ=0) const;
418 
428 
429 
430  void Print(const char *opt="") const;
431 
432 protected:
437  QMatrixC (const gsl_matrix_complex* mat);
438  QMatrixC(const double* orig);
439 
440  QMatrixC(gsl_complex *data,const UInt_t nrow,const UInt_t ncol,
441  const UInt_t tda=0);
442 
444  void SetMat() const;
445 
446  QComplex GetElement(const UInt_t i,const UInt_t j){
447  if( i<GetNRow() && j<fNCol ) return fData+2*(i*MemRowCElements()+j);
448  std::stringstream stream;
449  stream<<"N row: "<<GetNRow()<<" Index: "<<i;
450  stream<<"N col: "<<fNCol<<" Index: "<<j;
451  DianaThrow( QError(QERR_OUT_OF_RANGE,__FILE__,__LINE__,stream.str()));
452  return QComplex(Q_DOUBLE_DEFAULT);
453  }
454 
455  const QComplex GetElement(const UInt_t i,const UInt_t j) const {
456  if( i<GetNRow() && j<fNCol ) return fData+2*(i*MemRowCElements()+j);
457  std::stringstream stream;
458  stream<<"N row: "<<GetNRow()<<" Index: "<<i;
459  stream<<"N col: "<<fNCol<<" Index: "<<j;
460  DianaThrow( QError(QERR_OUT_OF_RANGE,__FILE__,__LINE__,stream.str()));
461  return QComplex(Q_DOUBLE_DEFAULT);
462  }
463 
464  UInt_t MemRowCElements() const {
465  return (fNCol>fTda ? fNCol : fTda);
466  }
467 
468  static void MatrixCopy(double *orig,UInt_t nrow,UInt_t ncol,double *dest,
469  UInt_t origTda=0,UInt_t destTda=0);
470 
471  //private:
472 protected:
473  Bool_t fDataOwner;
474  UInt_t fSize;
475  UInt_t fNCol;
476  UInt_t fTda;
477  UInt_t fAllocSize;
478  double *fData;//[fSize]
479 
480  mutable gsl_matrix_complex *fMat;
481 
482  friend class QVectorC;
483  friend class QMatrixCArray;
485 };
486 
487 // operations other than member functions
494 //QMatrix operator*(double t, const QMatrix&mat);
495 
496 // formatted printout
497 
499 std::ostream& operator<<(std::ostream&s,const Diana::QMatrixC& m);
500 
501 #endif
QVector vec(3)
#define DianaThrow(obj)
Definition: QDianaDebug.hh:26
#define Q_DOUBLE_DEFAULT
Definition: QDiana.hh:24
#define Q_END_NAMESPACE
Definition: QDiana.hh:22
#define Q_BEGIN_NAMESPACE
Definition: QDiana.hh:20
@ QERR_OUT_OF_RANGE
Definition: QError.hh:28
Q_END_NAMESPACE std::ostream & operator<<(std::ostream &s, const Diana::QMatrixC &m)
scalar times QMatrix
Definition: QMatrixC.cc:646
error class with error type and description
Definition: QError.hh:115
An array of complex matrices that have been laid out in memory.
Interface for complex matrices in Diana analysis.
Definition: QMatrixC.hh:27
QObjectDef(QMatrixC, 4)
UInt_t GetNRow() const
get number rows
Definition: QMatrixC.hh:87
void SetMat() const
Fill the GSL matrix data.
Definition: QMatrixC.cc:565
const QMatrixC & operator-=(const QMatrixC &mat)
subtract a QMatrixC
Definition: QMatrixC.cc:326
const QMatrixC & operator/=(const QComplex &t)
division by scalar
Definition: QMatrixC.cc:309
QComplex GetElement(const UInt_t i, const UInt_t j)
Definition: QMatrixC.hh:446
QMatrixC GetSubMatrix(UInt_t nI, UInt_t nJ, UInt_t startI=0, UInt_t startJ=0)
Get a sub matrix of the matrix.
Definition: QMatrixC.cc:579
void Initialize(const QComplex &val)
initialize all elements (default to 0)
Definition: QMatrixC.cc:187
UInt_t fAllocSize
Definition: QMatrixC.hh:477
virtual ~QMatrixC()
destructor
Definition: QMatrixC.cc:151
const QMatrixC & operator+=(const QMatrixC &mat)
add a QMatrixC
Definition: QMatrixC.cc:318
virtual const QMatrixC & CholeskyDecompose()
Cholesky Decomposition.
Definition: QMatrixC.cc:537
QVectorC GetRow(const UInt_t nrow) const
get row
Definition: QMatrixC.cc:232
QMatrixC GetSummedAreaMatrix() const
Create a summed area matrix.
Definition: QMatrixC.cc:606
void Initialize(const double re=0, const double im=0)
initialize all elements (default to 0)
Definition: QMatrixC.hh:102
gsl_matrix_complex * fMat
Definition: QMatrixC.hh:480
QVectorC GetDiagonal() const
get matrix diagonal
Definition: QMatrixC.cc:240
void Resize(const UInt_t nrow, const UInt_t ncol)
resize a QMatrixC
Definition: QMatrixC.cc:167
const QComplex GetElement(const UInt_t i, const UInt_t j) const
Definition: QMatrixC.hh:455
UInt_t GetNCol() const
get number of columns
Definition: QMatrixC.hh:92
QVector HermitianEigenValues()
Get a vector of the eigenvalues.
Definition: QMatrixC.cc:486
QMatrix Magnitude() const
return magnitude of each element
Definition: QMatrixC.cc:436
double * fData
Definition: QMatrixC.hh:478
void SetRow(const UInt_t nrow, const QVectorC &vec)
set row to specific vectors
Definition: QMatrixC.cc:212
QMatrixC GetConjugate() const
return conjugate matrix
Definition: QMatrixC.cc:430
UInt_t MemRowCElements() const
Definition: QMatrixC.hh:464
QMatrixC()
default constructor
Definition: QMatrixC.cc:51
static void MatrixCopy(double *orig, UInt_t nrow, UInt_t ncol, double *dest, UInt_t origTda=0, UInt_t destTda=0)
Definition: QMatrixC.cc:26
QMatrixC Inv() const
inverse
Definition: QMatrixC.cc:447
Bool_t fDataOwner
Definition: QMatrixC.hh:473
UInt_t Size() const
Return the number of complex numbers.
Definition: QMatrixC.hh:67
QMatrixC operator/(const QComplex &t) const
Division by scalar.
Definition: QMatrixC.cc:366
void BuildTest(UInt_t nI, UInt_t nJ)
Definition: QMatrixC.hh:70
void Clear()
reset members to default values
Definition: QMatrixC.cc:155
const QMatrixC & operator*=(const QComplex &t)
multiplication by scalar
Definition: QMatrixC.cc:278
const QMatrixC & Mult(const QMatrixC &mat)
Multiply element by element.
Definition: QMatrixC.cc:334
QMatrixC operator*(const QMatrixC &mat) const
MatrixC product.
Definition: QMatrixC.cc:349
void SetToIdentity()
initialize to identity
Definition: QMatrixC.cc:195
UInt_t fNCol
Definition: QMatrixC.hh:475
QMatrixC operator+(const QMatrixC &mat) const
sum matrix
Definition: QMatrixC.cc:378
QMatrixC(const double *orig)
UInt_t fTda
Definition: QMatrixC.hh:476
const QMatrixC & operator=(const QMatrixC &orig)
copy the content of another matrix
Definition: QMatrixC.cc:263
UInt_t fSize
Definition: QMatrixC.hh:474
QVectorC GetCol(const UInt_t ncol) const
get a QMatrix from a map
Definition: QMatrixC.cc:223
QMatrixC GetH() const
compute hermitian conjugate
Definition: QMatrixC.cc:416
QMatrixC T() const
transpose
Definition: QMatrixC.cc:397
virtual void CholeskySolveX(const QVectorC &Y, QVectorC &X) const
Return the inverse, using Cholesky decomposition.
Definition: QMatrixC.cc:552
virtual QMatrixC GetCholeskyDecomposition() const
Cholesky Decomposition.
Definition: QMatrixC.cc:547
QComplex operator()(const UInt_t i, const UInt_t j)
get row matching the integer value val in column col if more than one value is found in column the fi...
Definition: QMatrixC.cc:253
const QMatrixC & H()
compute hermitian conjugate
Definition: QMatrixC.cc:410
void HermitianEigenSystem(QVector &Val, QMatrixC &Vec)
Get the eigen values and vectors.
Definition: QMatrixC.cc:511
QComplex Det() const
Determinant.
Definition: QMatrixC.cc:470
const QMatrixC & Transpose()
transpose
Definition: QMatrixC.cc:403
const QMatrixC & Div(const QMatrixC &mat)
Divide element by element.
Definition: QMatrixC.cc:342
const QMatrixC & Invert()
inverse
Definition: QMatrixC.cc:453
const QMatrixC & Conjugate()
conjugate this matrix
Definition: QMatrixC.cc:421
QMatrixC operator-() const
revert sign to alla components
Definition: QMatrixC.cc:273
void SetCol(const UInt_t ncol, const QVectorC &vec)
set column to specific vector
Definition: QMatrixC.cc:200
Interface for matrices in Diana analysis.
Definition: QMatrix.hh:24
base class for objects handled by QEvent and QGlobalDataManager.
Definition: QObject.hh:76
virtual void Print() const
print content on screen
Definition: QObject.hh:163
Interface for complex vectors in Diana analysis.
Definition: QVectorC.hh:25
Interface for vectors in Diana analysis.
Definition: QVector.hh:30