synaps/linalg/Eigen.h

Go to the documentation of this file.
00001 /*********************************************************************
00002 *      This file is part of the source code of SYNAPS kernel.        *
00003 *      Author(s): B. Mourrain, GALAAD, INRIA                         *
00004 **********************************************************************
00005 History: 
00006 $Id: Eigen.h,v 1.1 2005/07/11 08:33:33 mourrain Exp $
00007 **********************************************************************/
00008 #ifndef SYNAPS_LINALG_EIGEN_H
00009 #define SYNAPS_LINALG_EIGEN_H
00010 //----------------------------------------------------------------------
00011 #include <synaps/init.h>
00012 #include <synaps/linalg/VectDse.h>
00013 #include <synaps/linalg/MatrDse.h>
00014 #include <synaps/linalg/MATRIX.m>
00015 
00016 //--------------------------------------------------------------------
00017 
00018 __BEGIN_NAMESPACE_SYNAPS
00019 
00020 
00021 namespace linalg
00022 {
00023 template<class T> struct rep1d;
00024 }
00025 
00026 namespace lapack
00027 {
00028 template<class C> struct rep2d;
00029 }
00030 
00031 
00032 //======================================================================
00033 /*{ \latexonly \subsubsection*{Classical eigenproblem.} \endlatexonly }*/
00034 //======================================================================
00038 //--------------------------------------------------------------------
00039 template<class VR_, class MR_> void eignval(VR_ & v, const MR_ & m);
00040 template<class VR_, class MR_> void eignval(VR_ & v, const MR_ & m, const Real & mth);
00041 
00043 template <class M> inline 
00044 VectDse<typename algebraic_closure<typename M::value_type>::T> Eigenval(M & A)
00045 {
00046   typedef VectDse<typename algebraic_closure<typename M::value_type>::T> V;
00047   V x(A.nbcol());
00048   eignval(x.rep(),A.rep());
00049   return x;
00050 }
00051 //----------------------------------------------------------------------
00053 template <class M> inline 
00054 VectDse<typename M::value_type> Eigenval(M & A, Real)
00055 {
00056   typedef VectDse<typename realof<typename M::value_type>::T> V;
00057   V x;
00058   eignval(x.rep(),A.rep(), Real());
00059   return x;
00060 }
00061 //----------------------------------------------------------------------
00063 template <class M> inline 
00064 VectDse<typename algebraic_closure<typename M::value_type>::T>
00065 Eigenval(M & A, VectDse<typename M::value_type> & Er)
00066 {
00067   typedef VectDse<typename algebraic_closure<typename M::value_type>::T> V;
00068   V x(A.nbcol());
00069   eignval(x.rep(),A.rep(), Er.rep());
00070   return x;
00071 }
00072 //----------------------------------------------------------------------
00074 template <class M>  inline 
00075 MatrDse<typename algebraic_closure<typename M::value_type>::T,
00076   typename lapack::rep2d<typename algebraic_closure<typename M::value_type>::T> > 
00077   Eigenvct(const M & A)
00078 {
00079   typedef MatrDse<typename algebraic_closure<typename M::value_type>::T, 
00080    typename lapack::rep2d<typename algebraic_closure<typename M::value_type>::T> > E;
00081   E x(A.nbcol(),A.nbrow());
00082   reigvct(x.rep(),A.rep());
00083   return x;
00084 }
00085 //----------------------------------------------------------------------
00087 template <class M> inline 
00088 M Eigenvct(M & A, Real)
00089 {
00090   M x(A.nbcol(),A.nbrow());
00091   reigvct(x.rep(), A.rep(), Real());
00092   return x;
00093 }
00094 
00095 //======================================================================
00096 /*{ \latexonly \subsubsection*{Generalized eigenproblem.} \endlatexonly }*/
00097 //======================================================================
00098 
00100 template <class M>  inline 
00101 VectDse<typename algebraic_closure<typename M::value_type>::T>
00102   Eigenval(const M & A, const M & B)
00103 {
00104   typedef VectDse<typename algebraic_closure<typename M::value_type>::T> V;
00105   V x(A.nbcol());
00106   eignval(x.rep(),A.rep(),B.rep());
00107   return x;
00108 }
00109 //----------------------------------------------------------------------
00111 template <class M>  inline 
00112 MatrDse<typename algebraic_closure<typename M::value_type>::T,
00113  typename lapack::rep2d<typename algebraic_closure<typename M::value_type>::T> >
00114   Eigenvct(const M & A, const M & B)
00115 {
00116   typedef MatrDse<typename algebraic_closure<typename M::value_type>::T,
00117     lapack::rep2d<typename algebraic_closure<typename M::value_type>::T> > E;
00118   E x(A.nbcol(),A.nbrow());
00119   reigvct(x.rep(),A.rep(),B.rep());
00120   return x;
00121 }
00122 //----------------------------------------------------------------------
00124 template <class M>  inline 
00125 VectDse<typename M::value_type> 
00126   Eigenval(const M & A, const M & B, Real reel)
00127 {
00128   typedef VectDse<typename M::value_type> V;
00129   V x(A.nbcol());
00130   eignval(x.rep(),A.rep(),B.rep(), reel);
00131   return x;
00132 }
00133 //----------------------------------------------------------------------
00135 template <class M> inline
00136 M  Eigenvct(M & A, M & B, Real r)
00137 {
00138   M x(A.nbcol(),A.nbrow());
00139   reigvct(x.rep(),A.rep(),B.rep(),r);
00140   return x;
00141 }
00142 //----------------------------------------------------------------------
00144 template <typename C,class M,class V> inline
00145 MatrDse<typename M::value_type, lapack::rep2d<typename M::value_type> > 
00146   Eigenvct(MatrDse<C,M> & A, 
00147            MatrDse<C,M> & B, Real r, 
00148            VectDse<V> & v)
00149 {
00150   typedef MatrDse<C,lapack::rep2d<typename M::value_type> > E;
00151   E x(A.nbcol(),A.nbrow());
00152   reigvct(x.rep(),A.rep(),B.rep(),r,v.rep());
00153   return x;
00154 }
00155 //----------------------------------------------------------------------
00160 template <class M> inline 
00161 MatrDse<typename M::value_type, lapack::rep2d<typename M::value_type> >
00162   Eigenvct(MatrDse<M> & A, 
00163            MatrDse<M> & B, Real reel, 
00164            const typename M::size_type & m)
00165 {
00166   typedef MatrDse<typename M::value_type, 
00167     lapack::rep2d<typename M::value_type> > E;
00168   E x(A.nbcol(),A.nbrow());
00169   reigvct(x.rep(),A.rep(),B.rep(),reel,m);
00170   return x;
00171 }
00172 
00173 
00174 __END_NAMESPACE_SYNAPS
00175 
00176 #endif // SYNAPS_LINALG_EIGEN_H
00177 

SYNAPS DOCUMENTATION
logo