45 template<
typename _MatrixType>
class FullPivLU
56 typedef typename MatrixType::Scalar
Scalar;
59 typedef typename MatrixType::Index
Index;
187 image(
const MatrixType& originalMatrix)
const 212 template<
typename Rhs>
301 result += (
abs(
m_lu.coeff(i,i)) > premultiplied_threshold);
365 eigen_assert(
m_lu.rows() ==
m_lu.cols() &&
"You can't take the inverse of a non-square matrix!");
367 (*
this, MatrixType::Identity(
m_lu.rows(),
m_lu.cols()));
386 template<
typename MatrixType>
392 template<
typename MatrixType>
404 template<
typename MatrixType>
417 template<
typename MatrixType>
426 const Index size = matrix.diagonalSize();
434 Index number_of_transpositions = 0;
439 for(
Index k = 0; k < size; ++k)
444 Index row_of_biggest_in_corner, col_of_biggest_in_corner;
446 biggest_in_corner =
m_lu.bottomRightCorner(rows-k, cols-k)
448 .maxCoeff(&row_of_biggest_in_corner, &col_of_biggest_in_corner);
449 row_of_biggest_in_corner += k;
450 col_of_biggest_in_corner += k;
457 for(
Index i = k; i < size; ++i)
472 if(k != row_of_biggest_in_corner) {
473 m_lu.row(k).swap(
m_lu.row(row_of_biggest_in_corner));
474 ++number_of_transpositions;
476 if(k != col_of_biggest_in_corner) {
477 m_lu.col(k).swap(
m_lu.col(col_of_biggest_in_corner));
478 ++number_of_transpositions;
485 m_lu.col(k).tail(rows-k-1) /=
m_lu.coeff(k,k);
487 m_lu.block(k+1,k+1,rows-k-1,cols-k-1).noalias() -=
m_lu.col(k).tail(rows-k-1) *
m_lu.row(k).tail(cols-k-1);
494 for(
Index k = size-1; k >= 0; --k)
498 for(
Index k = 0; k < size; ++k)
501 m_det_pq = (number_of_transpositions%2) ? -1 : 1;
505 template<
typename MatrixType>
509 eigen_assert(
m_lu.rows() ==
m_lu.cols() &&
"You can't take the determinant of a non-square matrix!");
516 template<
typename MatrixType>
524 res =
m_lu.leftCols(smalldim)
525 .template triangularView<UnitLower>().toDenseMatrix()
526 *
m_lu.topRows(smalldim)
527 .template triangularView<Upper>().toDenseMatrix();
541 template<
typename _MatrixType>
548 MatrixType::MaxColsAtCompileTime,
549 MatrixType::MaxRowsAtCompileTime)
552 template<
typename Dest>
void evalTo(Dest& dst)
const 555 const Index cols = dec().matrixLU().cols(), dimker = cols -
rank();
582 RealScalar premultiplied_threshold = dec().maxPivot() * dec().threshold();
584 for(
Index i = 0; i < dec().nonzeroPivots(); ++i)
585 if(
abs(dec().
matrixLU().coeff(i,i)) > premultiplied_threshold)
594 MaxSmallDimAtCompileTime, MatrixType::MaxColsAtCompileTime>
598 if(i) m.row(i).head(i).setZero();
599 m.row(i).tail(cols-i) = dec().matrixLU().row(pivots.
coeff(i)).
tail(cols-i);
602 m.block(0, 0,
rank(),
rank()).template triangularView<StrictlyLower>().
setZero();
604 m.col(i).swap(m.col(pivots.
coeff(i)));
610 .template triangularView<Upper>().solveInPlace(
611 m.topRightCorner(rank(), dimker)
616 m.col(i).swap(m.col(pivots.
coeff(i)));
619 for(
Index i = 0; i <
rank(); ++i) dst.row(dec().
permutationQ().indices().coeff(i)) = -m.row(i).tail(dimker);
627 template<
typename _MatrixType>
634 MatrixType::MaxColsAtCompileTime,
635 MatrixType::MaxRowsAtCompileTime)
638 template<
typename Dest>
void evalTo(Dest& dst)
const 651 RealScalar premultiplied_threshold = dec().maxPivot() * dec().threshold();
653 for(
Index i = 0; i < dec().nonzeroPivots(); ++i)
654 if(
abs(dec().
matrixLU().coeff(i,i)) > premultiplied_threshold)
659 dst.col(i) = originalMatrix().col(dec().
permutationQ().indices().coeff(pivots.
coeff(i)));
665 template<
typename _MatrixType,
typename Rhs>
671 template<typename Dest>
void evalTo(Dest& dst)
const 682 nonzero_pivots = dec().nonzeroPivots();
684 const Index smalldim = (std::min)(rows,
cols);
686 if(nonzero_pivots == 0)
692 typename Rhs::PlainObject c(rhs().
rows(), rhs().
cols());
695 c = dec().permutationP() * rhs();
699 .topLeftCorner(smalldim,smalldim)
700 .template triangularView<UnitLower>()
701 .solveInPlace(c.topRows(smalldim));
704 c.bottomRows(rows-
cols)
705 -= dec().matrixLU().bottomRows(rows-
cols)
711 .topLeftCorner(nonzero_pivots, nonzero_pivots)
712 .template triangularView<Upper>()
713 .solveInPlace(c.topRows(nonzero_pivots));
716 for(
Index i = 0; i < nonzero_pivots; ++i)
717 dst.row(dec().
permutationQ().indices().coeff(i)) = c.row(i);
718 for(
Index i = nonzero_pivots; i < dec().matrixLU().cols(); ++i)
719 dst.row(dec().
permutationQ().indices().coeff(i)).setZero();
733 template<
typename Derived>
PermutationMatrix< ColsAtCompileTime, MaxColsAtCompileTime > PermutationQType
bool m_usePrescribedThreshold
internal::traits< MatrixType >::StorageKind StorageKind
const internal::image_retval< FullPivLU > image(const MatrixType &originalMatrix) const
FullPivLU & setThreshold(const RealScalar &threshold)
RealScalar m_prescribedThreshold
internal::traits< MatrixType >::Scalar determinant() const
Derived & applyTranspositionOnTheRight(Index i, Index j)
Block< Derived > block(Index startRow, Index startCol, Index blockRows, Index blockCols)
Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...
#define eigen_internal_assert(x)
#define EIGEN_SIZE_MIN_PREFER_FIXED(a, b)
RealScalar threshold() const
void evalTo(Dest &dst) const
Index nonzeroPivots() const
EIGEN_STRONG_INLINE const CwiseUnaryOp< internal::scalar_abs_op< Scalar >, const Derived > abs() const
bool isSurjective() const
MatrixType::Scalar Scalar
EIGEN_STRONG_INLINE const Scalar & coeff(Index rowId, Index colId) const
IntRowVectorType m_colsTranspositions
FullPivLU & setThreshold(Default_t)
const PermutationQType & permutationQ() const
EIGEN_STRONG_INLINE Scalar & coeffRef(Index rowId, Index colId)
SegmentReturnType tail(Index vecSize)
const internal::solve_retval< FullPivLU, typename MatrixType::IdentityReturnType > inverse() const
NumTraits< typename MatrixType::Scalar >::Real RealScalar
FullPivLU & compute(const MatrixType &matrix)
internal::plain_col_type< MatrixType, Index >::type IntColVectorType
PermutationMatrix< RowsAtCompileTime, MaxRowsAtCompileTime > PermutationPType
MatrixType reconstructedMatrix() const
Transpose< PermutationBase > inverse() const
const PermutationPType & permutationP() const
#define EIGEN_MAKE_KERNEL_HELPERS(DecompositionType)
LU decomposition of a matrix with complete pivoting, and related features.
bool isInvertible() const
const FullPivLU< PlainObject > fullPivLu() const
FullPivLU()
Default Constructor.
IntColVectorType m_rowsTranspositions
#define EIGEN_MAKE_IMAGE_HELPERS(DecompositionType)
internal::plain_row_type< MatrixType, Index >::type IntRowVectorType
#define EIGEN_MAKE_SOLVE_HELPERS(DecompositionType, Rhs)
const MatrixType & matrixLU() const
void evalTo(Dest &dst) const
The matrix class, also used for vectors and row-vectors.
Index dimensionOfKernel() const
RealScalar maxPivot() const
Base class for all dense matrices, vectors, and expressions.
const internal::solve_retval< FullPivLU, Rhs > solve(const MatrixBase< Rhs > &b) const
const internal::kernel_retval< FullPivLU > kernel() const