359 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
360 eigen_assert(m_qr.rows() == m_qr.cols() &&
"You can't take the determinant of a non-square matrix!");
361 return m_qr.diagonal().cwiseAbs().array().log().sum();
364template<
typename MatrixType>
367 Index rows = matrix.rows();
368 Index cols = matrix.cols();
369 Index size = matrix.diagonalSize();
372 m_hCoeffs.resize(size);
376 m_colsTranspositions.resize(matrix.cols());
377 Index number_of_transpositions = 0;
379 m_colSqNorms.resize(cols);
380 for(Index k = 0; k < cols; ++k)
381 m_colSqNorms.coeffRef(k) = m_qr.col(k).squaredNorm();
383 RealScalar threshold_helper = m_colSqNorms.maxCoeff() * internal::abs2(NumTraits<Scalar>::epsilon()) / RealScalar(rows);
385 m_nonzero_pivots = size;
386 m_maxpivot = RealScalar(0);
388 for(Index k = 0; k < size; ++k)
391 Index biggest_col_index;
392 RealScalar biggest_col_sq_norm = m_colSqNorms.tail(cols-k).maxCoeff(&biggest_col_index);
393 biggest_col_index += k;
399 biggest_col_sq_norm = m_qr.col(biggest_col_index).tail(rows-k).squaredNorm();
402 m_colSqNorms.coeffRef(biggest_col_index) = biggest_col_sq_norm;
409 if(biggest_col_sq_norm < threshold_helper * RealScalar(rows-k))
411 m_nonzero_pivots = k;
412 m_hCoeffs.tail(size-k).setZero();
413 m_qr.bottomRightCorner(rows-k,cols-k)
414 .template triangularView<StrictlyLower>()
420 m_colsTranspositions.coeffRef(k) = biggest_col_index;
421 if(k != biggest_col_index) {
422 m_qr.col(k).swap(m_qr.col(biggest_col_index));
423 std::swap(m_colSqNorms.coeffRef(k), m_colSqNorms.coeffRef(biggest_col_index));
424 ++number_of_transpositions;
429 m_qr.col(k).tail(rows-k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
432 m_qr.coeffRef(k,k) = beta;
435 if(internal::abs(beta) > m_maxpivot) m_maxpivot = internal::abs(beta);
438 m_qr.bottomRightCorner(rows-k, cols-k-1)
439 .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k+1));
442 m_colSqNorms.tail(cols-k-1) -= m_qr.row(k).tail(cols-k-1).cwiseAbs2();
445 m_colsPermutation.setIdentity(PermIndexType(cols));
446 for(PermIndexType k = 0; k < m_nonzero_pivots; ++k)
447 m_colsPermutation.applyTranspositionOnTheRight(PermIndexType(k), PermIndexType(m_colsTranspositions.coeff(k)));
449 m_det_pq = (number_of_transpositions%2) ? -1 : 1;
450 m_isInitialized =
true;
457template<
typename _MatrixType,
typename Rhs>
458struct solve_retval<ColPivHouseholderQR<_MatrixType>, Rhs>
459 : solve_retval_base<ColPivHouseholderQR<_MatrixType>, Rhs>
461 EIGEN_MAKE_SOLVE_HELPERS(ColPivHouseholderQR<_MatrixType>,Rhs)
463 template<
typename Dest>
void evalTo(Dest& dst)
const
465 eigen_assert(rhs().rows() == dec().rows());
467 const int cols = dec().cols(),
468 nonzero_pivots = dec().nonzeroPivots();
470 if(nonzero_pivots == 0)
476 typename Rhs::PlainObject c(rhs());
479 c.applyOnTheLeft(householderSequence(dec().matrixQR(), dec().hCoeffs())
480 .setLength(dec().nonzeroPivots())
485 .topLeftCorner(nonzero_pivots, nonzero_pivots)
486 .template triangularView<Upper>()
487 .solveInPlace(c.topRows(nonzero_pivots));
490 typename Rhs::PlainObject d(c);
491 d.topRows(nonzero_pivots)
493 .topLeftCorner(nonzero_pivots, nonzero_pivots)
494 .template triangularView<Upper>()
495 * c.topRows(nonzero_pivots);
497 for(Index i = 0; i < nonzero_pivots; ++i) dst.row(dec().colsPermutation().indices().coeff(i)) = c.row(i);
498 for(Index i = nonzero_pivots; i < cols; ++i) dst.row(dec().colsPermutation().indices().coeff(i)).setZero();
505template<
typename MatrixType>
509 eigen_assert(m_isInitialized &&
"ColPivHouseholderQR is not initialized.");
510 return HouseholderSequenceType(m_qr, m_hCoeffs.conjugate()).setLength(m_nonzero_pivots);
517template<
typename Derived>