// @(#)root/matrix:$Id$
// Authors: Fons Rademakers, Eddy Offermann   Dec 2003

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TMatrixDEigen
#define ROOT_TMatrixDEigen

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TMatrixDEigen                                                        //
//                                                                      //
// Eigenvalues and eigenvectors of a real matrix.                       //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TMatrixD
#include "TMatrixD.h"
#endif
#ifndef ROOT_TVectorD
#include "TVectorD.h"
#endif

class TMatrixDEigen
{
protected :

   static void MakeHessenBerg  (TMatrixD &v,TVectorD &ortho,TMatrixD &H);
   static void MakeSchurr      (TMatrixD &v,TVectorD &d,    TVectorD &e,TMatrixD &H);
   static void Sort            (TMatrixD &v,TVectorD &d,    TVectorD &e);

   TMatrixD fEigenVectors;   // Eigen-vectors of matrix
   TVectorD fEigenValuesRe;  // Eigen-values
   TVectorD fEigenValuesIm;  // Eigen-values

public :

   enum {kWorkMax = 100}; // size of work array

   TMatrixDEigen()
     : fEigenVectors(), fEigenValuesRe(), fEigenValuesIm() {};
   TMatrixDEigen(const TMatrixD &a);
   TMatrixDEigen(const TMatrixDEigen &another);
   virtual ~TMatrixDEigen() {}

// If matrix A has shape (rowLwb,rowUpb,rowLwb,rowUpb), then each eigen-vector
// must have an index running between (rowLwb,rowUpb) .
// For convenience, the column index of the eigen-vector matrix
// also runs from rowLwb to rowUpb so that the returned matrix
// has also index/shape (rowLwb,rowUpb,rowLwb,rowUpb) .
// The same is true for the eigen-value vectors an matrix .

   const TMatrixD &GetEigenVectors () const { return fEigenVectors;  }
   const TVectorD &GetEigenValuesRe() const { return fEigenValuesRe; }
   const TVectorD &GetEigenValuesIm() const { return fEigenValuesIm; }
   const TMatrixD  GetEigenValues  () const;

   TMatrixDEigen &operator= (const TMatrixDEigen &source);

   ClassDef(TMatrixDEigen,1) // Eigen-Vectors/Values of a Matrix
};
#endif
 TMatrixDEigen.h:1
 TMatrixDEigen.h:2
 TMatrixDEigen.h:3
 TMatrixDEigen.h:4
 TMatrixDEigen.h:5
 TMatrixDEigen.h:6
 TMatrixDEigen.h:7
 TMatrixDEigen.h:8
 TMatrixDEigen.h:9
 TMatrixDEigen.h:10
 TMatrixDEigen.h:11
 TMatrixDEigen.h:12
 TMatrixDEigen.h:13
 TMatrixDEigen.h:14
 TMatrixDEigen.h:15
 TMatrixDEigen.h:16
 TMatrixDEigen.h:17
 TMatrixDEigen.h:18
 TMatrixDEigen.h:19
 TMatrixDEigen.h:20
 TMatrixDEigen.h:21
 TMatrixDEigen.h:22
 TMatrixDEigen.h:23
 TMatrixDEigen.h:24
 TMatrixDEigen.h:25
 TMatrixDEigen.h:26
 TMatrixDEigen.h:27
 TMatrixDEigen.h:28
 TMatrixDEigen.h:29
 TMatrixDEigen.h:30
 TMatrixDEigen.h:31
 TMatrixDEigen.h:32
 TMatrixDEigen.h:33
 TMatrixDEigen.h:34
 TMatrixDEigen.h:35
 TMatrixDEigen.h:36
 TMatrixDEigen.h:37
 TMatrixDEigen.h:38
 TMatrixDEigen.h:39
 TMatrixDEigen.h:40
 TMatrixDEigen.h:41
 TMatrixDEigen.h:42
 TMatrixDEigen.h:43
 TMatrixDEigen.h:44
 TMatrixDEigen.h:45
 TMatrixDEigen.h:46
 TMatrixDEigen.h:47
 TMatrixDEigen.h:48
 TMatrixDEigen.h:49
 TMatrixDEigen.h:50
 TMatrixDEigen.h:51
 TMatrixDEigen.h:52
 TMatrixDEigen.h:53
 TMatrixDEigen.h:54
 TMatrixDEigen.h:55
 TMatrixDEigen.h:56
 TMatrixDEigen.h:57
 TMatrixDEigen.h:58
 TMatrixDEigen.h:59
 TMatrixDEigen.h:60
 TMatrixDEigen.h:61
 TMatrixDEigen.h:62
 TMatrixDEigen.h:63
 TMatrixDEigen.h:64
 TMatrixDEigen.h:65
 TMatrixDEigen.h:66
 TMatrixDEigen.h:67
 TMatrixDEigen.h:68