11 #ifndef EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
12 #define EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
17 template<
typename _MatrixType>
struct traits<ColPivHouseholderQR<_MatrixType> >
46 template<
typename _MatrixType>
class ColPivHouseholderQR
50 typedef _MatrixType MatrixType;
52 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
53 ColsAtCompileTime = MatrixType::ColsAtCompileTime,
54 Options = MatrixType::Options,
55 MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
56 MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
58 typedef typename MatrixType::Scalar Scalar;
59 typedef typename MatrixType::RealScalar RealScalar;
61 typedef typename MatrixType::StorageIndex StorageIndex;
62 typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime, Options, MaxRowsAtCompileTime, MaxRowsAtCompileTime> MatrixQType;
63 typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
64 typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime> PermutationType;
65 typedef typename internal::plain_row_type<MatrixType, Index>::type IntRowVectorType;
66 typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
67 typedef typename internal::plain_row_type<MatrixType, RealScalar>::type RealRowVectorType;
68 typedef HouseholderSequence<MatrixType,typename internal::remove_all<typename HCoeffsType::ConjugateReturnType>::type> HouseholderSequenceType;
69 typedef typename MatrixType::PlainObject PlainObject;
73 typedef typename PermutationType::StorageIndex PermIndexType;
87 m_colsTranspositions(),
90 m_isInitialized(false),
91 m_usePrescribedThreshold(false) {}
101 m_hCoeffs((
std::min)(rows,cols)),
102 m_colsPermutation(PermIndexType(cols)),
103 m_colsTranspositions(cols),
106 m_isInitialized(false),
107 m_usePrescribedThreshold(false) {}
122 : m_qr(matrix.rows(), matrix.cols()),
123 m_hCoeffs((
std::min)(matrix.rows(),matrix.cols())),
124 m_colsPermutation(PermIndexType(matrix.cols())),
125 m_colsTranspositions(matrix.cols()),
126 m_temp(matrix.cols()),
127 m_colSqNorms(matrix.cols()),
128 m_isInitialized(false),
129 m_usePrescribedThreshold(false)
151 template<
typename Rhs>
155 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
160 HouseholderSequenceType matrixQ()
const
169 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
184 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
193 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
194 return m_colsPermutation;
235 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
236 RealScalar premultiplied_threshold = abs(m_maxpivot) *
threshold();
238 for(Index i = 0; i < m_nonzero_pivots; ++i)
239 result += (abs(m_qr.coeff(i,i)) > premultiplied_threshold);
251 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
252 return cols() -
rank();
264 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
265 return rank() == cols();
277 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
278 return rank() == rows();
289 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
300 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
304 inline Index rows()
const {
return m_qr.rows(); }
305 inline Index cols()
const {
return m_qr.cols(); }
311 const HCoeffsType&
hCoeffs()
const {
return m_hCoeffs; }
332 m_usePrescribedThreshold =
true;
347 m_usePrescribedThreshold =
false;
357 eigen_assert(m_isInitialized || m_usePrescribedThreshold);
358 return m_usePrescribedThreshold ? m_prescribedThreshold
373 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
374 return m_nonzero_pivots;
390 eigen_assert(m_isInitialized &&
"Decomposition is not initialized.");
394 #ifndef EIGEN_PARSED_BY_DOXYGEN
395 template<
typename RhsType,
typename DstType>
397 void _solve_impl(
const RhsType &rhs, DstType &dst)
const;
402 static void check_template_parameters()
404 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
408 HCoeffsType m_hCoeffs;
409 PermutationType m_colsPermutation;
410 IntRowVectorType m_colsTranspositions;
411 RowVectorType m_temp;
412 RealRowVectorType m_colSqNorms;
413 bool m_isInitialized, m_usePrescribedThreshold;
414 RealScalar m_prescribedThreshold, m_maxpivot;
415 Index m_nonzero_pivots;
419 template<
typename MatrixType>
423 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
424 eigen_assert(m_qr.rows() == m_qr.cols() &&
"You can't take the determinant of a non-square matrix!");
425 return abs(m_qr.diagonal().prod());
428 template<
typename MatrixType>
431 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
432 eigen_assert(m_qr.rows() == m_qr.cols() &&
"You can't take the determinant of a non-square matrix!");
433 return m_qr.diagonal().cwiseAbs().array().log().sum();
442 template<
typename MatrixType>
445 check_template_parameters();
448 Index rows = matrix.rows();
449 Index cols = matrix.cols();
450 Index size = matrix.diagonalSize();
456 m_hCoeffs.resize(size);
460 m_colsTranspositions.resize(matrix.cols());
461 Index number_of_transpositions = 0;
463 m_colSqNorms.resize(cols);
464 for(Index k = 0; k < cols; ++k)
465 m_colSqNorms.coeffRef(k) = m_qr.col(k).squaredNorm();
469 m_nonzero_pivots = size;
470 m_maxpivot = RealScalar(0);
472 for(Index k = 0; k < size; ++k)
475 Index biggest_col_index;
476 RealScalar biggest_col_sq_norm = m_colSqNorms.tail(cols-k).maxCoeff(&biggest_col_index);
477 biggest_col_index += k;
483 biggest_col_sq_norm = m_qr.col(biggest_col_index).tail(rows-k).squaredNorm();
486 m_colSqNorms.coeffRef(biggest_col_index) = biggest_col_sq_norm;
490 if(m_nonzero_pivots==size && biggest_col_sq_norm < threshold_helper * RealScalar(rows-k))
491 m_nonzero_pivots = k;
494 m_colsTranspositions.coeffRef(k) = biggest_col_index;
495 if(k != biggest_col_index) {
496 m_qr.col(k).swap(m_qr.col(biggest_col_index));
497 std::swap(m_colSqNorms.coeffRef(k), m_colSqNorms.coeffRef(biggest_col_index));
498 ++number_of_transpositions;
503 m_qr.col(k).tail(rows-k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
506 m_qr.coeffRef(k,k) = beta;
509 if(abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
512 m_qr.bottomRightCorner(rows-k, cols-k-1)
513 .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k+1));
516 m_colSqNorms.tail(cols-k-1) -= m_qr.row(k).tail(cols-k-1).cwiseAbs2();
519 m_colsPermutation.setIdentity(PermIndexType(cols));
520 for(PermIndexType k = 0; k < size; ++k)
521 m_colsPermutation.applyTranspositionOnTheRight(k, PermIndexType(m_colsTranspositions.coeff(k)));
523 m_det_pq = (number_of_transpositions%2) ? -1 : 1;
524 m_isInitialized =
true;
529 #ifndef EIGEN_PARSED_BY_DOXYGEN
530 template<
typename _MatrixType>
531 template<
typename RhsType,
typename DstType>
534 eigen_assert(rhs.rows() == rows());
536 const Index nonzero_pivots = nonzeroPivots();
538 if(nonzero_pivots == 0)
544 typename RhsType::PlainObject c(rhs);
548 .setLength(nonzero_pivots)
552 m_qr.topLeftCorner(nonzero_pivots, nonzero_pivots)
553 .template triangularView<Upper>()
554 .solveInPlace(c.topRows(nonzero_pivots));
556 for(Index i = 0; i < nonzero_pivots; ++i) dst.row(m_colsPermutation.indices().coeff(i)) = c.row(i);
557 for(Index i = nonzero_pivots; i < cols(); ++i) dst.row(m_colsPermutation.indices().coeff(i)).setZero();
563 template<
typename DstXprType,
typename MatrixType,
typename Scalar>
564 struct Assignment<DstXprType, Inverse<ColPivHouseholderQR<MatrixType> >,
internal::assign_op<Scalar>, Dense2Dense, Scalar>
566 typedef ColPivHouseholderQR<MatrixType> QrType;
567 typedef Inverse<QrType> SrcXprType;
568 static void run(DstXprType &dst,
const SrcXprType &src,
const internal::assign_op<Scalar> &)
570 dst = src.nestedExpression().solve(MatrixType::Identity(src.rows(), src.cols()));
579 template<
typename MatrixType>
583 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
584 return HouseholderSequenceType(m_qr, m_hCoeffs.conjugate());
592 template<
typename Derived>
602 #endif // EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
const PermutationType & colsPermutation() const
Definition: ColPivHouseholderQR.h:191
ColPivHouseholderQR & compute(const MatrixType &matrix)
Definition: ColPivHouseholderQR.h:443
Index nonzeroPivots() const
Definition: ColPivHouseholderQR.h:371
const Inverse< ColPivHouseholderQR > inverse() const
Definition: ColPivHouseholderQR.h:298
bool isInjective() const
Definition: ColPivHouseholderQR.h:262
ColPivHouseholderQR()
Default Constructor.
Definition: ColPivHouseholderQR.h:83
ColPivHouseholderQR(Index rows, Index cols)
Default Constructor with memory preallocation.
Definition: ColPivHouseholderQR.h:99
const Solve< ColPivHouseholderQR, Rhs > solve(const MatrixBase< Rhs > &b) const
Definition: ColPivHouseholderQR.h:153
MatrixType::RealScalar logAbsDeterminant() const
Definition: ColPivHouseholderQR.h:429
Index rank() const
Definition: ColPivHouseholderQR.h:232
bool isInvertible() const
Definition: ColPivHouseholderQR.h:287
Definition: StdDeque.h:58
Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...
Definition: NumTraits.h:107
HouseholderSequence< VectorsType, CoeffsType > householderSequence(const VectorsType &v, const CoeffsType &h)
Convenience function for constructing a Householder sequence.
Definition: HouseholderSequence.h:452
ComputationInfo info() const
Reports whether the QR factorization was succesful.
Definition: ColPivHouseholderQR.h:388
Expression of the inverse of another expression.
Definition: Inverse.h:45
ColPivHouseholderQR & setThreshold(Default_t)
Definition: ColPivHouseholderQR.h:345
RealScalar threshold() const
Definition: ColPivHouseholderQR.h:355
const MatrixType & matrixR() const
Definition: ColPivHouseholderQR.h:182
Householder rank-revealing QR decomposition of a matrix with column-pivoting.
Definition: ForwardDeclarations.h:252
const MatrixType & matrixQR() const
Definition: ColPivHouseholderQR.h:167
HouseholderSequenceType householderQ() const
Definition: ColPivHouseholderQR.h:581
const HCoeffsType & hCoeffs() const
Definition: ColPivHouseholderQR.h:311
const ColPivHouseholderQR< PlainObject > colPivHouseholderQr() const
Definition: ColPivHouseholderQR.h:594
Definition: Constants.h:424
ColPivHouseholderQR & setThreshold(const RealScalar &threshold)
Definition: ColPivHouseholderQR.h:330
RealScalar maxPivot() const
Definition: ColPivHouseholderQR.h:380
Definition: Eigen_Colamd.h:54
MatrixType::RealScalar absDeterminant() const
Definition: ColPivHouseholderQR.h:420
bool isSurjective() const
Definition: ColPivHouseholderQR.h:275
ColPivHouseholderQR(const MatrixType &matrix)
Constructs a QR factorization from a given matrix.
Definition: ColPivHouseholderQR.h:121
Pseudo expression representing a solving operation.
Definition: Solve.h:63
ComputationInfo
Definition: Constants.h:422
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:48
Index dimensionOfKernel() const
Definition: ColPivHouseholderQR.h:249