16bool qr(
const mat<T> &a, mat<T> &q, up_tri_mat<T> &r)
21 unsigned n = a.nrows();
22 unsigned m = a.ncols();
28 T scale,sigma,sum,tau;
33 scale=std::max((T)scale,(T)std::abs(rr(i,k)));
39 for (i=k;i<n;i++) rr(i,k) /= scale;
40 for (sum=0.0,i=k;i<n;i++) sum += rr(i,k)*rr(i,k);
41 sigma=sign((T)sqrt(sum),(T)rr(k,k));
46 for (sum=0.0,i=k;i<n;i++)
47 sum += rr(i,k)*rr(i,j);
50 rr(i,j) -= tau*rr(i,k);
58 for (j=0;j<n;j++) q(i,j)=0.0;
69 sum += rr(i,k)*q(j,i);
72 q(j,i) -= sum*rr(i,k);
79 for (j=0;j<i;j++) rr(i,j)=0.0;
81 for(
unsigned i = 0; i < n;i++)
82 for(
unsigned j = i; j < n; j++)
90bool qr_mgs(
const mat<T> &a, mat<T> &q, up_tri_mat<T> &r)
92 unsigned n = a.nrows();
93 unsigned m = a.ncols();
98 for(
unsigned j = 0; j < m; j++)
101 for(
unsigned i = 0; i < j; i++)
103 r(i,j) = dot(q.col(i),v);
104 v= v- r(i,j)*q.col(i);
107 if(std::abs(r(j,j)) == 0)
109 q.set_col(j, v/r(j,j));
123bool rq(
const mat<T> &a, up_tri_mat<T> &r, mat<T> &q)
125 unsigned N = a.nrows();
128 mat<T> p=transpose(a);
131 if(!qr(p,q,r))
return false;
144 rr.set_col(0,-rr.col(0));
145 q.set_row(0,-q.row(0));
149 for(
unsigned i = 0; i< r.nrows();i++)
150 for(
unsigned j = i; j< r.ncols();j++)