15#ifndef EIGEN_LMQRSOLV_H
16#define EIGEN_LMQRSOLV_H
19#include "./InternalHeaderCheck.h"
25template <
typename Scalar,
int Rows,
int Cols,
typename PermIndex>
26void lmqrsolv(Matrix<Scalar, Rows, Cols> &s,
const PermutationMatrix<Dynamic, Dynamic, PermIndex> &iPerm,
27 const Matrix<Scalar, Dynamic, 1> &diag,
const Matrix<Scalar, Dynamic, 1> &qtb,
28 Matrix<Scalar, Dynamic, 1> &x, Matrix<Scalar, Dynamic, 1> &sdiag) {
33 Matrix<Scalar, Dynamic, 1> wa(n);
34 JacobiRotation<Scalar> givens;
45 s.topLeftCorner(n, n).template triangularView<StrictlyLower>() = s.topLeftCorner(n, n).transpose();
47 for (j = 0; j < n; ++j) {
50 const PermIndex l = iPerm.indices()(j);
51 if (diag[l] == 0.)
break;
52 sdiag.tail(n - j).setZero();
59 for (k = j; k < n; ++k) {
62 givens.makeGivens(-s(k, k), sdiag[k]);
66 s(k, k) = givens.c() * s(k, k) + givens.s() * sdiag[k];
67 temp = givens.c() * wa[k] + givens.s() * qtbpj;
68 qtbpj = -givens.s() * wa[k] + givens.c() * qtbpj;
72 for (i = k + 1; i < n; ++i) {
73 temp = givens.c() * s(i, k) + givens.s() * sdiag[i];
74 sdiag[i] = -givens.s() * s(i, k) + givens.c() * sdiag[i];
83 for (nsing = 0; nsing < n && sdiag[nsing] != 0; nsing++) {
86 wa.tail(n - nsing).setZero();
87 s.topLeftCorner(nsing, nsing).transpose().template triangularView<Upper>().solveInPlace(wa.head(nsing));
97template <
typename Scalar,
int Options_,
typename Index>
98void lmqrsolv(SparseMatrix<Scalar, Options_, Index> &s,
const PermutationMatrix<Dynamic, Dynamic> &iPerm,
99 const Matrix<Scalar, Dynamic, 1> &diag,
const Matrix<Scalar, Dynamic, 1> &qtb,
100 Matrix<Scalar, Dynamic, 1> &x, Matrix<Scalar, Dynamic, 1> &sdiag) {
102 typedef SparseMatrix<Scalar, RowMajor, Index> FactorType;
106 Matrix<Scalar, Dynamic, 1> wa(n);
107 JacobiRotation<Scalar> givens;
117 for (j = 0; j < n; ++j) {
120 l = iPerm.indices()(j);
121 if (diag(l) == Scalar(0))
break;
122 sdiag.tail(n - j).setZero();
130 for (k = j; k < n; ++k) {
131 typename FactorType::InnerIterator itk(R, k);
141 givens.makeGivens(-itk.value(), sdiag(k));
145 itk.valueRef() = givens.c() * itk.value() + givens.s() * sdiag(k);
146 temp = givens.c() * wa(k) + givens.s() * qtbpj;
147 qtbpj = -givens.s() * wa(k) + givens.c() * qtbpj;
151 for (++itk; itk; ++itk) {
153 temp = givens.c() * itk.value() + givens.s() * sdiag(i);
154 sdiag(i) = -givens.s() * itk.value() + givens.c() * sdiag(i);
155 itk.valueRef() = temp;
163 for (nsing = 0; nsing < n && sdiag(nsing) != 0; nsing++) {
166 wa.tail(n - nsing).setZero();
168 wa.head(nsing) = R.topLeftCorner(nsing, nsing).template triangularView<Upper>().solve (wa.head(nsing));
170 sdiag = R.diagonal();
Namespace containing all symbols from the Eigen library.
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index