37 #ifndef GMM_CONDITION_NUMBER_H__ 
   38 #define GMM_CONDITION_NUMBER_H__ 
   52   template <
typename MAT> 
 
   53   typename number_traits<
typename  
   54   linalg_traits<MAT>::value_type>::magnitude_type
 
   56           typename number_traits<
typename 
   57           linalg_traits<MAT>::value_type>::magnitude_type& emin,
 
   58           typename number_traits<
typename 
   59           linalg_traits<MAT>::value_type>::magnitude_type& emax) {
 
   60     typedef typename linalg_traits<MAT>::value_type T;
 
   61     typedef typename number_traits<T>::magnitude_type R;
 
   64     if (
sizeof(T) != 
sizeof(R) && gmm::abs(
gmm::lu_det(M)) == R(0))
 
   65       return  gmm::default_max(R());
 
   67     size_type m = mat_nrows(M), n = mat_ncols(M);
 
   69     std::vector<R> eig(m+n);
 
   71     if (m+n == 0) 
return R(0);
 
   74       gmm::symmetric_qr_algorithm(M, eig);
 
   77       dense_matrix<T> B(m+n, m+n); 
 
   79       gmm::copy(M, sub_matrix(B, sub_interval(0, m),
 
   81       gmm::symmetric_qr_algorithm(B, eig);
 
   83     emin = emax = gmm::abs(eig[0]);
 
   84     for (size_type i = 1; i < eig.size(); ++i) {
 
   85       R e = gmm::abs(eig[i]); 
 
   86       emin = std::min(emin, e);
 
   87       emax = std::max(emax, e);
 
   90     if (emin == R(0)) 
return gmm::default_max(R());
 
   94   template <
typename MAT> 
 
   95   typename number_traits<
typename  
   96   linalg_traits<MAT>::value_type>::magnitude_type
 
   97   condition_number(
const MAT& M) { 
 
   98     typename number_traits<
typename 
   99       linalg_traits<MAT>::value_type>::magnitude_type emax, emin;
 
  100     return condition_number(M, emin, emax);
 
  103   template <
typename MAT> 
 
  104   typename number_traits<
typename  
  105   linalg_traits<MAT>::value_type>::magnitude_type
 
  106   Frobenius_condition_number_sqr(
const MAT& M) { 
 
  107     typedef typename linalg_traits<MAT>::value_type T;
 
  108     typedef typename number_traits<T>::magnitude_type R;
 
  109     size_type m = mat_nrows(M), n = mat_ncols(M);
 
  110     dense_matrix<T> B(std::min(m,n), std::min(m,n));
 
  111     if (m < n) 
mult(M,gmm::conjugated(M),B);
 
  112     else       mult(gmm::conjugated(M),M,B);
 
  118   template <
typename MAT> 
 
  119   typename number_traits<
typename  
  120   linalg_traits<MAT>::value_type>::magnitude_type
 
  121   Frobenius_condition_number(
const MAT& M)
 
  122   { 
return sqrt(Frobenius_condition_number_sqr(M)); }
 
  126   template <
typename MAT> 
 
  127   typename number_traits<
typename  
  128   linalg_traits<MAT>::value_type>::magnitude_type
 
  130           typename number_traits<
typename 
  131           linalg_traits<MAT>::value_type>::magnitude_type& emin,
 
  132           typename number_traits<
typename 
  133           linalg_traits<MAT>::value_type>::magnitude_type& emax) {
 
  137   template <
typename MAT> 
 
  138   typename number_traits<
typename  
  139   linalg_traits<MAT>::value_type>::magnitude_type
 
  140   condest(
const MAT& M) { 
 
  141     typename number_traits<
typename 
  142       linalg_traits<MAT>::value_type>::magnitude_type emax, emin;
 
  143     return condest(M, emin, emax);
 
void copy(const L1 &l1, L2 &l2)
*/
 
linalg_traits< M >::value_type mat_trace(const M &m)
Trace of a matrix.
 
void mult(const L1 &l1, const L2 &l2, L3 &l3)
*/
 
bool is_hermitian(const MAT &A, magnitude_of_linalg(MAT) tol=magnitude_of_linalg(MAT)(-1))
*/
 
number_traits< typename linalg_traits< MAT >::value_type >::magnitude_type condition_number(const MAT &M, typename number_traits< typename linalg_traits< MAT >::value_type >::magnitude_type &emin, typename number_traits< typename linalg_traits< MAT >::value_type >::magnitude_type &emax)
computation of the condition number of dense matrices using SVD.
 
number_traits< typename linalg_traits< MAT >::value_type >::magnitude_type condest(const MAT &M, typename number_traits< typename linalg_traits< MAT >::value_type >::magnitude_type &emin, typename number_traits< typename linalg_traits< MAT >::value_type >::magnitude_type &emax)
estimation of the condition number (TO BE DONE...)
 
conjugated_return< L >::return_type conjugated(const L &v)
return a conjugated view of the input matrix or vector.
 
linalg_traits< DenseMatrixLU >::value_type lu_det(const DenseMatrixLU &LU, const Pvector &pvector)
Compute the matrix determinant (via a LU factorization)
 
size_t size_type
used as the common size type in the library