11 #ifndef EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
12 #define EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
37 template<
typename _MatrixType>
class ColPivHouseholderQR
41 typedef _MatrixType MatrixType;
43 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
44 ColsAtCompileTime = MatrixType::ColsAtCompileTime,
45 Options = MatrixType::Options,
46 MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
47 MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
49 typedef typename MatrixType::Scalar Scalar;
50 typedef typename MatrixType::RealScalar RealScalar;
51 typedef typename MatrixType::Index Index;
52 typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime, Options, MaxRowsAtCompileTime, MaxRowsAtCompileTime> MatrixQType;
53 typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
54 typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime> PermutationType;
55 typedef typename internal::plain_row_type<MatrixType, Index>::type IntRowVectorType;
56 typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
57 typedef typename internal::plain_row_type<MatrixType, RealScalar>::type RealRowVectorType;
58 typedef HouseholderSequence<MatrixType,typename internal::remove_all<typename HCoeffsType::ConjugateReturnType>::type> HouseholderSequenceType;
62 typedef typename PermutationType::Index PermIndexType;
76 m_colsTranspositions(),
79 m_isInitialized(false) {}
89 m_hCoeffs((std::min)(rows,cols)),
90 m_colsPermutation(PermIndexType(cols)),
91 m_colsTranspositions(cols),
94 m_isInitialized(false),
95 m_usePrescribedThreshold(false) {}
110 : m_qr(matrix.rows(), matrix.cols()),
111 m_hCoeffs((std::min)(matrix.rows(),matrix.cols())),
112 m_colsPermutation(PermIndexType(matrix.cols())),
113 m_colsTranspositions(matrix.cols()),
114 m_temp(matrix.cols()),
115 m_colSqNorms(matrix.cols()),
116 m_isInitialized(false),
117 m_usePrescribedThreshold(false)
139 template<
typename Rhs>
140 inline const internal::solve_retval<ColPivHouseholderQR, Rhs>
143 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
144 return internal::solve_retval<ColPivHouseholderQR, Rhs>(*
this, b.derived());
148 HouseholderSequenceType matrixQ(
void)
const
157 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
172 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
181 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
182 return m_colsPermutation;
223 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
224 RealScalar premultiplied_threshold = abs(m_maxpivot) *
threshold();
226 for(Index i = 0; i < m_nonzero_pivots; ++i)
227 result += (abs(m_qr.coeff(i,i)) > premultiplied_threshold);
239 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
240 return cols() -
rank();
252 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
253 return rank() == cols();
265 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
266 return rank() == rows();
277 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
287 internal::solve_retval<ColPivHouseholderQR, typename MatrixType::IdentityReturnType>
290 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
291 return internal::solve_retval<ColPivHouseholderQR,typename MatrixType::IdentityReturnType>
292 (*
this, MatrixType::Identity(m_qr.rows(), m_qr.cols()));
295 inline Index rows()
const {
return m_qr.rows(); }
296 inline Index cols()
const {
return m_qr.cols(); }
302 const HCoeffsType&
hCoeffs()
const {
return m_hCoeffs; }
323 m_usePrescribedThreshold =
true;
338 m_usePrescribedThreshold =
false;
348 eigen_assert(m_isInitialized || m_usePrescribedThreshold);
349 return m_usePrescribedThreshold ? m_prescribedThreshold
364 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
365 return m_nonzero_pivots;
381 eigen_assert(m_isInitialized &&
"Decomposition is not initialized.");
387 HCoeffsType m_hCoeffs;
388 PermutationType m_colsPermutation;
389 IntRowVectorType m_colsTranspositions;
390 RowVectorType m_temp;
391 RealRowVectorType m_colSqNorms;
392 bool m_isInitialized, m_usePrescribedThreshold;
393 RealScalar m_prescribedThreshold, m_maxpivot;
394 Index m_nonzero_pivots;
398 template<
typename MatrixType>
402 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
403 eigen_assert(m_qr.rows() == m_qr.cols() &&
"You can't take the determinant of a non-square matrix!");
404 return abs(m_qr.diagonal().prod());
407 template<
typename MatrixType>
410 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
411 eigen_assert(m_qr.rows() == m_qr.cols() &&
"You can't take the determinant of a non-square matrix!");
412 return m_qr.diagonal().cwiseAbs().array().log().sum();
421 template<
typename MatrixType>
425 Index rows = matrix.rows();
426 Index cols = matrix.cols();
427 Index size = matrix.diagonalSize();
433 m_hCoeffs.resize(size);
437 m_colsTranspositions.resize(matrix.cols());
438 Index number_of_transpositions = 0;
440 m_colSqNorms.resize(cols);
441 for(Index k = 0; k < cols; ++k)
442 m_colSqNorms.coeffRef(k) = m_qr.col(k).squaredNorm();
446 m_nonzero_pivots = size;
447 m_maxpivot = RealScalar(0);
449 for(Index k = 0; k < size; ++k)
452 Index biggest_col_index;
453 RealScalar biggest_col_sq_norm = m_colSqNorms.tail(cols-k).maxCoeff(&biggest_col_index);
454 biggest_col_index += k;
460 biggest_col_sq_norm = m_qr.col(biggest_col_index).tail(rows-k).squaredNorm();
463 m_colSqNorms.coeffRef(biggest_col_index) = biggest_col_sq_norm;
470 if(biggest_col_sq_norm < threshold_helper * RealScalar(rows-k))
472 m_nonzero_pivots = k;
473 m_hCoeffs.tail(size-k).setZero();
474 m_qr.bottomRightCorner(rows-k,cols-k)
475 .template triangularView<StrictlyLower>()
481 m_colsTranspositions.coeffRef(k) = biggest_col_index;
482 if(k != biggest_col_index) {
483 m_qr.col(k).swap(m_qr.col(biggest_col_index));
484 std::swap(m_colSqNorms.coeffRef(k), m_colSqNorms.coeffRef(biggest_col_index));
485 ++number_of_transpositions;
490 m_qr.col(k).tail(rows-k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
493 m_qr.coeffRef(k,k) = beta;
496 if(abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
499 m_qr.bottomRightCorner(rows-k, cols-k-1)
500 .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k+1));
503 m_colSqNorms.tail(cols-k-1) -= m_qr.row(k).tail(cols-k-1).cwiseAbs2();
506 m_colsPermutation.setIdentity(PermIndexType(cols));
507 for(PermIndexType k = 0; k < m_nonzero_pivots; ++k)
508 m_colsPermutation.applyTranspositionOnTheRight(k, PermIndexType(m_colsTranspositions.coeff(k)));
510 m_det_pq = (number_of_transpositions%2) ? -1 : 1;
511 m_isInitialized =
true;
518 template<
typename _MatrixType,
typename Rhs>
520 : solve_retval_base<ColPivHouseholderQR<_MatrixType>, Rhs>
524 template<typename Dest>
void evalTo(Dest& dst)
const
526 eigen_assert(rhs().rows() == dec().rows());
528 const Index cols = dec().cols(),
529 nonzero_pivots = dec().nonzeroPivots();
531 if(nonzero_pivots == 0)
537 typename Rhs::PlainObject c(rhs());
541 .setLength(dec().nonzeroPivots())
546 .topLeftCorner(nonzero_pivots, nonzero_pivots)
547 .template triangularView<Upper>()
548 .solveInPlace(c.topRows(nonzero_pivots));
550 for(Index i = 0; i < nonzero_pivots; ++i) dst.row(dec().colsPermutation().indices().coeff(i)) = c.row(i);
551 for(Index i = nonzero_pivots; i < cols; ++i) dst.row(dec().colsPermutation().indices().coeff(i)).setZero();
558 template<
typename MatrixType>
562 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
570 template<
typename Derived>
579 #endif // EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
MatrixType::RealScalar absDeterminant() const
Definition: ColPivHouseholderQR.h:399
MatrixType::RealScalar logAbsDeterminant() const
Definition: ColPivHouseholderQR.h:408
RealScalar maxPivot() const
Definition: ColPivHouseholderQR.h:371
RealScalar threshold() const
Definition: ColPivHouseholderQR.h:346
Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...
Definition: NumTraits.h:88
const HCoeffsType & hCoeffs() const
Definition: ColPivHouseholderQR.h:302
const MatrixType & matrixQR() const
Definition: ColPivHouseholderQR.h:155
HouseholderSequence< VectorsType, CoeffsType > householderSequence(const VectorsType &v, const CoeffsType &h)
Convenience function for constructing a Householder sequence.
Definition: HouseholderSequence.h:422
ColPivHouseholderQR()
Default Constructor.
Definition: ColPivHouseholderQR.h:72
ComputationInfo info() const
Reports whether the QR factorization was succesful.
Definition: ColPivHouseholderQR.h:379
HouseholderSequenceType householderQ(void) const
Definition: ColPivHouseholderQR.h:560
ColPivHouseholderQR(const MatrixType &matrix)
Constructs a QR factorization from a given matrix.
Definition: ColPivHouseholderQR.h:109
Sequence of Householder reflections acting on subspaces with decreasing size.
Definition: ForwardDeclarations.h:227
ColPivHouseholderQR & compute(const MatrixType &matrix)
Definition: ColPivHouseholderQR.h:422
const PermutationType & colsPermutation() const
Definition: ColPivHouseholderQR.h:179
bool isSurjective() const
Definition: ColPivHouseholderQR.h:263
Householder rank-revealing QR decomposition of a matrix with column-pivoting.
Definition: ForwardDeclarations.h:222
bool isInjective() const
Definition: ColPivHouseholderQR.h:250
bool isInvertible() const
Definition: ColPivHouseholderQR.h:275
ColPivHouseholderQR & setThreshold(Default_t)
Definition: ColPivHouseholderQR.h:336
ColPivHouseholderQR & setThreshold(const RealScalar &threshold)
Definition: ColPivHouseholderQR.h:321
const internal::solve_retval< ColPivHouseholderQR, Rhs > solve(const MatrixBase< Rhs > &b) const
Definition: ColPivHouseholderQR.h:141
const MatrixType & matrixR() const
Definition: ColPivHouseholderQR.h:170
Index nonzeroPivots() const
Definition: ColPivHouseholderQR.h:362
Definition: Constants.h:376
const internal::solve_retval< ColPivHouseholderQR, typename MatrixType::IdentityReturnType > inverse() const
Definition: ColPivHouseholderQR.h:288
Index dimensionOfKernel() const
Definition: ColPivHouseholderQR.h:237
ColPivHouseholderQR(Index rows, Index cols)
Default Constructor with memory preallocation.
Definition: ColPivHouseholderQR.h:87
ComputationInfo
Definition: Constants.h:374
Index rank() const
Definition: ColPivHouseholderQR.h:220
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:48
const ColPivHouseholderQR< PlainObject > colPivHouseholderQr() const
Definition: ColPivHouseholderQR.h:572