void qr(const matrix_type& A, matrix_type& Q, matrix_type& R) { using namespace boost::numeric::ublas; typedef typename matrix_type::size_type size_type; typedef typename matrix_type::value_type value_type; // TODO resize Q and R to match the needed size. int m=A.size1(); int n=A.size2(); identity_matrix<value_type> ident(m); if (Q.size1() != ident.size1() || Q.size2() != ident.size2()) Q = matrix_type(m, m); Q.assign(ident); R.clear(); R = A; for (size_type k=0; k< R.size1() && k<R.size2(); k++) { slice s1(k, 1, m - k); slice s2(k, 0, m - k); unit_vector<value_type> e1(m - k, 0); // x = A(k:m, k); matrix_vector_slice<matrix_type> x(R, s1, s2); matrix_type F(x.size(), x.size()); Reflector(x, F); matrix_type temp = subrange(R, k, m, k, n); //F = prod(F, temp); subrange(R, k, m, k, n) = prod(F, temp); // <<---------------------------------------------->> // forming Q identity_matrix<value_type> iqk(A.size1()); matrix_type Q_k(iqk); subrange(Q_k, Q_k.size1() - F.size1(), Q_k.size1(), Q_k.size2() - F.size2(), Q_k.size2()) = F; Q = prod(Q, Q_k); } }