00001
00002
00003
00004
00005
00006
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
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
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