Go to the documentation of this file.00001 namespace internal {
00002
00003
00004 template <typename Scalar>
00005 void qrsolv(
00006 Matrix< Scalar, Dynamic, Dynamic > &s,
00007
00008 const VectorXi &ipvt,
00009 const Matrix< Scalar, Dynamic, 1 > &diag,
00010 const Matrix< Scalar, Dynamic, 1 > &qtb,
00011 Matrix< Scalar, Dynamic, 1 > &x,
00012 Matrix< Scalar, Dynamic, 1 > &sdiag)
00013
00014 {
00015 typedef DenseIndex Index;
00016
00017
00018 Index i, j, k, l;
00019 Scalar temp;
00020 Index n = s.cols();
00021 Matrix< Scalar, Dynamic, 1 > wa(n);
00022 JacobiRotation<Scalar> givens;
00023
00024
00025
00026
00027
00028
00029
00030 x = s.diagonal();
00031 wa = qtb;
00032
00033 s.topLeftCorner(n,n).template triangularView<StrictlyLower>() = s.topLeftCorner(n,n).transpose();
00034
00035
00036 for (j = 0; j < n; ++j) {
00037
00038
00039
00040 l = ipvt[j];
00041 if (diag[l] == 0.)
00042 break;
00043 sdiag.tail(n-j).setZero();
00044 sdiag[j] = diag[l];
00045
00046
00047
00048
00049 Scalar qtbpj = 0.;
00050 for (k = j; k < n; ++k) {
00051
00052
00053 givens.makeGivens(-s(k,k), sdiag[k]);
00054
00055
00056
00057 s(k,k) = givens.c() * s(k,k) + givens.s() * sdiag[k];
00058 temp = givens.c() * wa[k] + givens.s() * qtbpj;
00059 qtbpj = -givens.s() * wa[k] + givens.c() * qtbpj;
00060 wa[k] = temp;
00061
00062
00063 for (i = k+1; i<n; ++i) {
00064 temp = givens.c() * s(i,k) + givens.s() * sdiag[i];
00065 sdiag[i] = -givens.s() * s(i,k) + givens.c() * sdiag[i];
00066 s(i,k) = temp;
00067 }
00068 }
00069 }
00070
00071
00072
00073 Index nsing;
00074 for(nsing=0; nsing<n && sdiag[nsing]!=0; nsing++) {}
00075
00076 wa.tail(n-nsing).setZero();
00077 s.topLeftCorner(nsing, nsing).transpose().template triangularView<Upper>().solveInPlace(wa.head(nsing));
00078
00079
00080 sdiag = s.diagonal();
00081 s.diagonal() = x;
00082
00083
00084 for (j = 0; j < n; ++j) x[ipvt[j]] = wa[j];
00085 }
00086
00087 }