36 #ifndef GMM_CONDITION_NUMBER_H__
37 #define GMM_CONDITION_NUMBER_H__
51 template <
typename MAT>
52 typename number_traits<
typename
53 linalg_traits<MAT>::value_type>::magnitude_type
55 typename number_traits<
typename
56 linalg_traits<MAT>::value_type>::magnitude_type& emin,
57 typename number_traits<
typename
58 linalg_traits<MAT>::value_type>::magnitude_type& emax) {
59 typedef typename linalg_traits<MAT>::value_type T;
60 typedef typename number_traits<T>::magnitude_type R;
63 if (
sizeof(T) !=
sizeof(R) && gmm::abs(
gmm::lu_det(M)) == R(0))
64 return gmm::default_max(R());
66 size_type m = mat_nrows(M), n = mat_ncols(M);
68 std::vector<R> eig(m+n);
70 if (m+n == 0)
return R(0);
73 gmm::symmetric_qr_algorithm(M, eig);
76 dense_matrix<T> B(m+n, m+n);
78 gmm::copy(M, sub_matrix(B, sub_interval(0, m),
80 gmm::symmetric_qr_algorithm(B, eig);
82 emin = emax = gmm::abs(eig[0]);
83 for (size_type i = 1; i < eig.size(); ++i) {
84 R e = gmm::abs(eig[i]);
85 emin = std::min(emin, e);
86 emax = std::max(emax, e);
89 if (emin == R(0))
return gmm::default_max(R());
93 template <
typename MAT>
94 typename number_traits<
typename
95 linalg_traits<MAT>::value_type>::magnitude_type
96 condition_number(
const MAT& M) {
97 typename number_traits<
typename
98 linalg_traits<MAT>::value_type>::magnitude_type emax, emin;
99 return condition_number(M, emin, emax);
102 template <
typename MAT>
103 typename number_traits<
typename
104 linalg_traits<MAT>::value_type>::magnitude_type
105 Frobenius_condition_number_sqr(
const MAT& M) {
106 typedef typename linalg_traits<MAT>::value_type T;
107 typedef typename number_traits<T>::magnitude_type R;
108 size_type m = mat_nrows(M), n = mat_ncols(M);
109 dense_matrix<T> B(std::min(m,n), std::min(m,n));
110 if (m < n)
mult(M,gmm::conjugated(M),B);
111 else mult(gmm::conjugated(M),M,B);
117 template <
typename MAT>
118 typename number_traits<
typename
119 linalg_traits<MAT>::value_type>::magnitude_type
120 Frobenius_condition_number(
const MAT& M)
121 {
return sqrt(Frobenius_condition_number_sqr(M)); }
125 template <
typename MAT>
126 typename number_traits<
typename
127 linalg_traits<MAT>::value_type>::magnitude_type
129 typename number_traits<
typename
130 linalg_traits<MAT>::value_type>::magnitude_type& emin,
131 typename number_traits<
typename
132 linalg_traits<MAT>::value_type>::magnitude_type& emax) {
136 template <
typename MAT>
137 typename number_traits<
typename
138 linalg_traits<MAT>::value_type>::magnitude_type
139 condest(
const MAT& M) {
140 typename number_traits<
typename
141 linalg_traits<MAT>::value_type>::magnitude_type emax, emin;
142 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