66 #ifndef GMM_MODIFIED_GRAM_SCHMIDT_H
67 #define GMM_MODIFIED_GRAM_SCHMIDT_H
74 class modified_gram_schmidt {
76 typedef dense_matrix<T> MAT;
81 modified_gram_schmidt(
int restart,
size_t s) : M(s, restart+1) {}
83 typename linalg_traits<MAT>::const_sub_col_type
84 operator[](
size_t i)
const {
return mat_const_col(M, i); }
86 typename linalg_traits<MAT>::sub_col_type
87 operator[](
size_t i) {
return mat_col(M, i); }
89 inline size_type nrows(
void)
const {
return M.nrows(); }
90 inline size_type ncols(
void)
const {
return M.ncols(); }
91 MAT &mat(
void) {
return M; }
92 const MAT &mat(
void)
const {
return M; }
96 template <
typename T,
typename VecHi>
inline
97 void orthogonalize(modified_gram_schmidt<T>& V,
const VecHi& Hi_,
size_t i) {
98 VecHi& Hi =
const_cast<VecHi&
>(Hi_);
100 for (
size_t k = 0; k <= i; k++) {
102 gmm::add(gmm::scaled(V[k], -Hi[k]), V[i+1]);
106 template <
typename T,
typename VecHi>
107 void orthogonalize_with_refinment(modified_gram_schmidt<T>& V,
108 const VecHi& Hi_,
size_t i) {
109 VecHi& Hi =
const_cast<VecHi&
>(Hi_);
110 orthogonalize(V, Hi_, i);
112 sub_interval SUBI(0, V.nrows()), SUBJ(0, i+1);
113 std::vector<T> corr(i+1);
116 gmm::mult(sub_matrix(V.mat(), SUBI, SUBJ),
117 scaled(corr, T(-1)), V[i+1],V[i+1]);
118 gmm::add(corr, sub_vector(Hi, SUBJ));
121 template <
typename T,
typename VecS,
typename VecX>
122 void combine(modified_gram_schmidt<T>& V,
const VecS& s, VecX& x,
size_t i)
123 {
for (
size_t j = 0; j < i; ++j) gmm::add(gmm::scaled(V[j], s[j]), x); }
strongest_value_type< V1, V2 >::value_type vect_hp(const V1 &v1, const V2 &v2)
*/
void mult(const L1 &l1, const L2 &l2, L3 &l3)
*/
void add(const L1 &l1, L2 &l2)
*/
conjugated_return< L >::return_type conjugated(const L &v)
return a conjugated view of the input matrix or vector.
Include the base gmm files.
size_t size_type
used as the common size type in the library