Fn_eig

Functions

template<typename T1 >
void eig_sym (Col< typename T1::pod_type > &eigval, const Base< typename T1::elem_type, T1 > &X)
 Eigenvalues of real/complex symmetric/hermitian matrix X.
template<typename T1 >
Col< typename T1::pod_type > eig_sym (const Base< typename T1::elem_type, T1 > &X)
 Eigenvalues of real/complex symmetric/hermitian matrix X.
template<typename T1 >
void eig_sym (Col< typename T1::pod_type > &eigval, Mat< typename T1::elem_type > &eigvec, const Base< typename T1::elem_type, T1 > &X)
 Eigenvalues and eigenvectors of real/complex symmetric/hermitian matrix X.
template<typename T1 >
void eig_gen (Col< std::complex< typename T1::pod_type > > &eigval, Mat< typename T1::elem_type > &l_eigvec, Mat< typename T1::elem_type > &r_eigvec, const Base< typename T1::elem_type, T1 > &X)
 Eigenvalues and eigenvectors (both left and right) of general real/complex square matrix X.
template<typename eT , typename T1 >
void eig_gen (Col< std::complex< eT > > &eigval, Mat< std::complex< eT > > &eigvec, const Base< eT, T1 > &X, const char side= 'r')
 Eigenvalues and eigenvectors of general real square matrix X. Optional argument 'side' specifies which eigenvectors should be computed: 'r' for right (default) and 'l' for left.
template<typename T , typename T1 >
void eig_gen (Col< std::complex< T > > &eigval, Mat< std::complex< T > > &eigvec, const Base< std::complex< T >, T1 > &X, const char side= 'r')
 Eigenvalues and eigenvectors of general complex square matrix X Optional argument 'side' specifies which eigenvectors should be computed: 'r' for right (default) and 'l' for left.

Function Documentation

template<typename T1 >
void eig_sym ( Col< typename T1::pod_type > &  eigval,
const Base< typename T1::elem_type, T1 > &  X 
) [inline]

Eigenvalues of real/complex symmetric/hermitian matrix X.

Definition at line 31 of file fn_eig.hpp.

References auxlib::eig_sym(), and Base< elem_type, derived >::get_ref().

Referenced by eig_sym().

00032   {
00033   arma_extra_debug_sigprint();
00034   
00035   typedef typename T1::elem_type eT;
00036   
00037   // unwrap_check not used as T1::elem_type and T1::pod_type may not be the same.
00038   // furthermore, it doesn't matter if A is an alias of S, as auxlib::eig() makes a copy of A
00039 
00040   const unwrap<T1> tmp(X.get_ref());
00041   const Mat<eT>& A = tmp.M;
00042 
00043   auxlib::eig_sym(eigval, A);
00044   }

template<typename T1 >
Col<typename T1::pod_type> eig_sym ( const Base< typename T1::elem_type, T1 > &  X  )  [inline]

Eigenvalues of real/complex symmetric/hermitian matrix X.

Definition at line 52 of file fn_eig.hpp.

References eig_sym().

00053   {
00054   arma_extra_debug_sigprint();
00055   
00056   Col<typename T1::pod_type> out;
00057   eig_sym(out, X);
00058   
00059   return out;
00060   }

template<typename T1 >
void eig_sym ( Col< typename T1::pod_type > &  eigval,
Mat< typename T1::elem_type > &  eigvec,
const Base< typename T1::elem_type, T1 > &  X 
) [inline]

Eigenvalues and eigenvectors of real/complex symmetric/hermitian matrix X.

Definition at line 68 of file fn_eig.hpp.

References auxlib::eig_sym(), and Base< elem_type, derived >::get_ref().

00073   {
00074   arma_extra_debug_sigprint();
00075 
00076   typedef typename T1::elem_type eT;
00077   
00078   const unwrap<T1> tmp(X.get_ref());
00079   const Mat<eT>& A = tmp.M;
00080   
00081   auxlib::eig_sym(eigval, eigvec, A);
00082   }

template<typename T1 >
void eig_gen ( Col< std::complex< typename T1::pod_type > > &  eigval,
Mat< typename T1::elem_type > &  l_eigvec,
Mat< typename T1::elem_type > &  r_eigvec,
const Base< typename T1::elem_type, T1 > &  X 
) [inline]

Eigenvalues and eigenvectors (both left and right) of general real/complex square matrix X.

Definition at line 97 of file fn_eig.hpp.

References auxlib::eig_gen(), and Base< elem_type, derived >::get_ref().

00103   {
00104   arma_extra_debug_sigprint();
00105 
00106   typedef typename T1::elem_type eT;
00107   
00108   const unwrap<T1> tmp(X.get_ref());
00109   const Mat<eT>& A = tmp.M;
00110 
00111   auxlib::eig_gen(eigval, l_eigvec, r_eigvec, A, 'b');
00112   }

template<typename eT , typename T1 >
void eig_gen ( Col< std::complex< eT > > &  eigval,
Mat< std::complex< eT > > &  eigvec,
const Base< eT, T1 > &  X,
const char  side = 'r' 
) [inline]

Eigenvalues and eigenvectors of general real square matrix X. Optional argument 'side' specifies which eigenvectors should be computed: 'r' for right (default) and 'l' for left.

Definition at line 123 of file fn_eig.hpp.

References arma_stop(), Mat< eT >::at(), conj(), auxlib::eig_gen(), Base< elem_type, derived >::get_ref(), and Mat< eT >::set_size().

00129   {
00130   arma_extra_debug_sigprint();
00131 
00132   //std::cout << "real" << std::endl;
00133 
00134   const unwrap<T1> tmp(X.get_ref());
00135   const Mat<eT>& A = tmp.M;
00136 
00137   Mat<eT> dummy_eigvec;
00138   Mat<eT> tmp_eigvec;
00139   
00140   switch(side)
00141     {
00142     case 'r':
00143       auxlib::eig_gen(eigval, dummy_eigvec, tmp_eigvec, A, side);
00144       break;
00145 
00146     case 'l':
00147       auxlib::eig_gen(eigval, tmp_eigvec, dummy_eigvec, A, side);
00148       break;
00149       
00150     default:
00151       arma_stop("eig_gen(): parameter 'side' is invalid");
00152     }
00153 
00154 
00155   const u32 n = A.n_rows;
00156 
00157   if(n > 0)
00158     {
00159     eigvec.set_size(n,n);
00160 
00161     for(u32 j=0; j<n; ++j)
00162       {
00163       if( (j < n-1) && (eigval[j] == std::conj(eigval[j+1])) )
00164         {
00165         // eigvec.col(j)   = Mat< std::complex<eT> >( tmp_eigvec.col(j),  tmp_eigvec.col(j+1) );
00166         // eigvec.col(j+1) = Mat< std::complex<eT> >( tmp_eigvec.col(j), -tmp_eigvec.col(j+1) );
00167 
00168         for(u32 i=0; i<n; ++i)
00169           {
00170           eigvec.at(i,j)   = std::complex<eT>( tmp_eigvec.at(i,j),  tmp_eigvec.at(i,j+1) );
00171           eigvec.at(i,j+1) = std::complex<eT>( tmp_eigvec.at(i,j), -tmp_eigvec.at(i,j+1) );
00172           }
00173 
00174         ++j;
00175         }
00176       else
00177         {
00178         // eigvec.col(i) = tmp_eigvec.col(i);
00179 
00180         for(u32 i=0; i<n; ++i)
00181           {
00182           eigvec.at(i,j) = std::complex<eT>(tmp_eigvec.at(i,j), eT(0));
00183           }
00184 
00185         }
00186       }
00187     }
00188 
00189   }

template<typename T , typename T1 >
void eig_gen ( Col< std::complex< T > > &  eigval,
Mat< std::complex< T > > &  eigvec,
const Base< std::complex< T >, T1 > &  X,
const char  side = 'r' 
) [inline]

Eigenvalues and eigenvectors of general complex square matrix X Optional argument 'side' specifies which eigenvectors should be computed: 'r' for right (default) and 'l' for left.

Definition at line 200 of file fn_eig.hpp.

References arma_stop(), auxlib::eig_gen(), and Base< elem_type, derived >::get_ref().

00206   {
00207   arma_extra_debug_sigprint();
00208   //std::cout << "complex" << std::endl;
00209 
00210   typedef typename std::complex<T> eT;
00211 
00212   const unwrap<T1> tmp(X.get_ref());
00213   const Mat<eT>& A = tmp.M;
00214 
00215   Mat<eT> dummy_eigvec;
00216   
00217   switch(side)
00218     {
00219     case 'r':
00220       auxlib::eig_gen(eigval, dummy_eigvec, eigvec, A, side);
00221       break;
00222 
00223     case 'l':
00224       auxlib::eig_gen(eigval, eigvec, dummy_eigvec, A, side);
00225       break;
00226       
00227     default:
00228       arma_stop("eig_gen(): parameter 'side' is invalid");
00229     }
00230   }