25 #include <boost/numeric/ublas/matrix.hpp>
26 #include <boost/numeric/ublas/matrix_proxy.hpp>
27 #include <boost/numeric/ublas/vector.hpp>
28 #include <boost/numeric/ublas/io.hpp>
38 template<
class matrix_type,
class vector_type>
41 using namespace boost::numeric::ublas;
43 typedef typename matrix_type::value_type value_type;
45 unit_vector<value_type> e1(x.size(), 0);
48 double x_2 = norm_2(x);
49 boost::numeric::ublas::vector<value_type>
50 v_k((
x(0) >= 0 ? x_2 : -1 * x_2) * e1 + x);
53 double norm_vk = norm_2(v_k);
58 identity_matrix<value_type> eye(v_k.size());
59 F = matrix_type(v_k.size(), v_k.size());
61 F = eye - 2. * outer_prod(v_k, v_k);
68 template<
class matrix_type,
class vector_type>
71 using namespace boost::numeric::ublas;
73 matrix_type
F(x.size(), x.size());
75 Reflector<matrix_type, vector_type>(
x,
F);
80 template<
class matrix_type>
81 void qr(
const matrix_type&
A, matrix_type& Q, matrix_type& R)
83 using namespace boost::numeric::ublas;
85 typedef typename matrix_type::size_type size_type;
86 typedef typename matrix_type::value_type value_type;
92 identity_matrix<value_type>
ident(m);
93 if (Q.size1() != ident.size1() || Q.size2() != ident.size2())
94 Q = matrix_type(m, m);
100 for (size_type
k=0;
k< R.size1() &&
k<R.size2();
k++)
102 slice s1(
k, 1, m -
k);
103 slice s2(
k, 0, m -
k);
104 unit_vector<value_type> e1(m -
k, 0);
107 matrix_vector_slice<matrix_type>
x(R, s1, s2);
108 matrix_type
F(x.size(), x.size());
112 matrix_type temp = subrange(R,
k, m,
k, n);
114 subrange(R,
k, m,
k, n) = prod(
F, temp);
118 identity_matrix<value_type> iqk(A.size1());
119 matrix_type Q_k(iqk);
121 subrange(Q_k, Q_k.size1() -
F.size1(), Q_k.size1(),
122 Q_k.size2() -
F.size2(), Q_k.size2()) =
F;