36 std::vector<T> msigma;
53 : _m(m), _n(n), QR(A), p(n)
56 throw ValueError(ERROR_MSG(
"Number of rows smaller than of columns"));
60 for (
int i = 0; i < QR.size(); i++)
61 if (NumberOperations::abs(QR[i]) > sfactor)
62 sfactor = NumberOperations::abs(QR[i]);
64 for (
int i = 0; i < QR.size(); i++) QR[i] /= sfactor;
67 std::vector<T> cnorms(n, 0);
69 for (
int j = 0; j < n; j++)
70 for (
int i = 0; i < m; i++)
71 cnorms[j] += QR[i + j * m] * QR[i + j * m];
75 for (
int j = 0; j < n; j++) p[j] = j;
77 for (
int k = 0; k < n; k++) {
80 for (
int j = k + 1; j < n; j++)
81 if (cnorms[p[j]] > cnorms[p[pivot]])
84 if (cnorms[p[pivot]] <= sing_eps)
break;
92 T s = NumberOperations::sqrt(cnorms[p[k]]);
94 if (QR[k + p[k] * m] < 0) s *= -1;
95 QR[k + p[k] * m] += s;
97 T gamma_inv = s * QR[k + p[k] * m];
101 for (
int j = k + 1; j < n; j++) {
103 for (
int i = k; i < m; i++)
104 tau += QR[i + p[k] * m] * QR[i + p[j] * m];
107 for (
int i = k; i < m; i++)
108 QR[i + p[j] * m] -= tau * QR[i + p[k] * m];
112 for (
int j = k + 1; j < n; j++)
113 cnorms[p[j]] -= QR[k + p[j] * m] * QR[k + p[j] * m];
118 for (
int i = 0; i < msigma.size(); i++)
137 int rank()
const {
return sigma.size(); }
150 int perm(
int j)
const {
return p[j]; }
164 const T&
R(
int i,
int j)
const
166 if (i == j)
return msigma[i];
168 return QR[i + p[j] * _m];
174 for (
int k = sigma.size() - 1; k >= 0; k--) {
177 for (
int i = k; i < _m; i++)
178 tau += QR[i + p[k] * _m] * x[i];
180 tau /= sigma[k] * QR[k + p[k] * _m];
182 for (
int i = k; i < _m; i++)
183 x[i] -= tau * QR[i + p[k] * _m];
190 for (
int k = 0; k < sigma.size(); k++) {
193 for (
int i = k; i < _m; i++)
194 tau += QR[i + p[k] * _m] * x[i];
196 tau /= sigma[k] * QR[k + p[k] * _m];
198 for (
int i = k; i < _m; i++)
199 x[i] -= tau * QR[i + p[k] * _m];