15 #ifndef EIGEN_LMQRSOLV_H
16 #define EIGEN_LMQRSOLV_H
22 template <
typename Scalar,
int Rows,
int Cols,
typename Index>
24 Matrix<Scalar,Rows,Cols> &s,
25 const PermutationMatrix<Dynamic,Dynamic,Index> &iPerm,
26 const Matrix<Scalar,Dynamic,1> &diag,
27 const Matrix<Scalar,Dynamic,1> &qtb,
28 Matrix<Scalar,Dynamic,1> &x,
29 Matrix<Scalar,Dynamic,1> &sdiag)
36 Matrix<Scalar,Dynamic,1> wa(n);
37 JacobiRotation<Scalar> givens;
49 s.topLeftCorner(n,n).template triangularView<StrictlyLower>() = s.topLeftCorner(n,n).transpose();
51 for (j = 0; j < n; ++j) {
55 l = iPerm.indices()(j);
58 sdiag.tail(n-j).setZero();
65 for (k = j; k < n; ++k) {
68 givens.makeGivens(-s(k,k), sdiag[k]);
72 s(k,k) = givens.c() * s(k,k) + givens.s() * sdiag[k];
73 temp = givens.c() * wa[k] + givens.s() * qtbpj;
74 qtbpj = -givens.s() * wa[k] + givens.c() * qtbpj;
78 for (i = k+1; i<n; ++i) {
79 temp = givens.c() * s(i,k) + givens.s() * sdiag[i];
80 sdiag[i] = -givens.s() * s(i,k) + givens.c() * sdiag[i];
89 for(nsing=0; nsing<n && sdiag[nsing]!=0; nsing++) {}
91 wa.tail(n-nsing).setZero();
92 s.topLeftCorner(nsing, nsing).transpose().template triangularView<Upper>().solveInPlace(wa.head(nsing));
102 template <
typename Scalar,
int _Options,
typename Index>
104 SparseMatrix<Scalar,_Options,Index> &s,
105 const PermutationMatrix<Dynamic,Dynamic> &iPerm,
106 const Matrix<Scalar,Dynamic,1> &diag,
107 const Matrix<Scalar,Dynamic,1> &qtb,
108 Matrix<Scalar,Dynamic,1> &x,
109 Matrix<Scalar,Dynamic,1> &sdiag)
112 typedef SparseMatrix<Scalar,RowMajor,Index> FactorType;
116 Matrix<Scalar,Dynamic,1> wa(n);
117 JacobiRotation<Scalar> givens;
127 for (j = 0; j < n; ++j)
131 l = iPerm.indices()(j);
132 if (diag(l) == Scalar(0))
134 sdiag.tail(n-j).setZero();
142 for (k = j; k < n; ++k)
144 typename FactorType::InnerIterator itk(R,k);
146 if (itk.index() < k)
continue;
152 givens.makeGivens(-itk.value(), sdiag(k));
156 itk.valueRef() = givens.c() * itk.value() + givens.s() * sdiag(k);
157 temp = givens.c() * wa(k) + givens.s() * qtbpj;
158 qtbpj = -givens.s() * wa(k) + givens.c() * qtbpj;
162 for (++itk; itk; ++itk)
165 temp = givens.c() * itk.value() + givens.s() * sdiag(i);
166 sdiag(i) = -givens.s() * itk.value() + givens.c() * sdiag(i);
167 itk.valueRef() = temp;
175 for(nsing = 0; nsing<n && sdiag(nsing) !=0; nsing++) {}
177 wa.tail(n-nsing).setZero();
179 wa.head(nsing) = R.topLeftCorner(nsing,nsing).template triangularView<Upper>().solve(wa.head(nsing));
181 sdiag = R.diagonal();
189 #endif // EIGEN_LMQRSOLV_H