Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
Eigen::FullPivLU< _MatrixType > Class Template Reference

LU decomposition of a matrix with complete pivoting, and related features. More...

#include <src/eigen/Eigen/src/LU/FullPivLU.h>

+ Inheritance diagram for Eigen::FullPivLU< _MatrixType >:
+ Collaboration diagram for Eigen::FullPivLU< _MatrixType >:

Public Types

enum  { MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime , MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime }
 
typedef _MatrixType MatrixType
 
typedef SolverBase< FullPivLUBase
 
typedef internal::plain_row_type< MatrixType, StorageIndex >::type IntRowVectorType
 
typedef internal::plain_col_type< MatrixType, StorageIndex >::type IntColVectorType
 
typedef PermutationMatrix< ColsAtCompileTime, MaxColsAtCompileTimePermutationQType
 
typedef PermutationMatrix< RowsAtCompileTime, MaxRowsAtCompileTimePermutationPType
 
typedef MatrixType::PlainObject PlainObject
 
enum  
 
typedef internal::traits< FullPivLU< _MatrixType > >::Scalar Scalar
 
typedef Scalar CoeffReturnType
 
typedef internal::add_const< Transpose< constDerived > >::type ConstTransposeReturnType
 
typedef internal::conditional< NumTraits< Scalar >::IsComplex, CwiseUnaryOp< internal::scalar_conjugate_op< Scalar >, ConstTransposeReturnType >, ConstTransposeReturnType >::type AdjointReturnType
 
typedef Eigen::Index Index
 The interface type of indices.
 
typedef internal::traits< Derived >::StorageKind StorageKind
 

Public Member Functions

 FullPivLU ()
 Default Constructor.
 
 FullPivLU (Index rows, Index cols)
 Default Constructor with memory preallocation.
 
template<typename InputType >
 FullPivLU (const EigenBase< InputType > &matrix)
 
template<typename InputType >
 FullPivLU (EigenBase< InputType > &matrix)
 Constructs a LU factorization from a given matrix.
 
template<typename InputType >
FullPivLUcompute (const EigenBase< InputType > &matrix)
 
const MatrixTypematrixLU () const
 
Index nonzeroPivots () const
 
RealScalar maxPivot () const
 
EIGEN_DEVICE_FUNC const PermutationPTypepermutationP () const
 
const PermutationQTypepermutationQ () const
 
const internal::kernel_retval< FullPivLUkernel () const
 
const internal::image_retval< FullPivLUimage (const MatrixType &originalMatrix) const
 
template<typename Rhs >
const Solve< FullPivLU, Rhs > solve (const MatrixBase< Rhs > &b) const
 
RealScalar rcond () const
 
internal::traits< MatrixType >::Scalar determinant () const
 
FullPivLUsetThreshold (const RealScalar &threshold)
 
FullPivLUsetThreshold (Default_t)
 
RealScalar threshold () const
 
Index rank () const
 
Index dimensionOfKernel () const
 
bool isInjective () const
 
bool isSurjective () const
 
bool isInvertible () const
 
const Inverse< FullPivLUinverse () const
 
MatrixType reconstructedMatrix () const
 
EIGEN_DEVICE_FUNC Index rows () const
 
EIGEN_DEVICE_FUNC Index cols () const
 
template<typename RhsType , typename DstType >
EIGEN_DEVICE_FUNC void _solve_impl (const RhsType &rhs, DstType &dst) const
 
template<bool Conjugate, typename RhsType , typename DstType >
EIGEN_DEVICE_FUNC void _solve_impl_transposed (const RhsType &rhs, DstType &dst) const
 
template<typename RhsType , typename DstType >
void _solve_impl (const RhsType &rhs, DstType &dst) const
 
template<bool Conjugate, typename RhsType , typename DstType >
void _solve_impl_transposed (const RhsType &rhs, DstType &dst) const
 
ConstTransposeReturnType transpose () const
 
AdjointReturnType adjoint () const
 
EIGEN_DEVICE_FUNC FullPivLU< _MatrixType > & derived ()
 
EIGEN_DEVICE_FUNC const FullPivLU< _MatrixType > & derived () const
 
EIGEN_DEVICE_FUNC Derived & const_cast_derived () const
 
EIGEN_DEVICE_FUNC const Derived & const_derived () const
 
EIGEN_DEVICE_FUNC Index size () const
 
template<typename Dest >
EIGEN_DEVICE_FUNC void evalTo (Dest &dst) const
 
template<typename Dest >
EIGEN_DEVICE_FUNC void addTo (Dest &dst) const
 
template<typename Dest >
EIGEN_DEVICE_FUNC void subTo (Dest &dst) const
 
template<typename Dest >
EIGEN_DEVICE_FUNC void applyThisOnTheRight (Dest &dst) const
 
template<typename Dest >
EIGEN_DEVICE_FUNC void applyThisOnTheLeft (Dest &dst) const
 

Protected Member Functions

void computeInPlace ()
 

Static Protected Member Functions

static void check_template_parameters ()
 

Protected Attributes

MatrixType m_lu
 
PermutationPType m_p
 
PermutationQType m_q
 
IntColVectorType m_rowsTranspositions
 
IntRowVectorType m_colsTranspositions
 
Index m_nonzero_pivots
 
RealScalar m_l1_norm
 
RealScalar m_maxpivot
 
RealScalar m_prescribedThreshold
 
signed char m_det_pq
 
bool m_isInitialized
 
bool m_usePrescribedThreshold
 

Detailed Description

template<typename _MatrixType>
class Eigen::FullPivLU< _MatrixType >

LU decomposition of a matrix with complete pivoting, and related features.

Template Parameters
_MatrixTypethe type of the matrix of which we are computing the LU decomposition

This class represents a LU decomposition of any matrix, with complete pivoting: the matrix A is decomposed as $ A = P^{-1} L U Q^{-1} $ where L is unit-lower-triangular, U is upper-triangular, and P and Q are permutation matrices. This is a rank-revealing LU decomposition. The eigenvalues (diagonal coefficients) of U are sorted in such a way that any zeros are at the end.

This decomposition provides the generic approach to solving systems of linear equations, computing the rank, invertibility, inverse, kernel, and determinant.

This LU decomposition is very stable and well tested with large matrices. However there are use cases where the SVD decomposition is inherently more stable and/or flexible. For example, when computing the kernel of a matrix, working with the SVD allows to select the smallest singular values of the matrix, something that the LU decomposition doesn't see.

The data of the LU decomposition can be directly accessed through the methods matrixLU(), permutationP(), permutationQ().

As an exemple, here is how the original matrix can be retrieved:

Output:

This class supports the inplace decomposition mechanism.

See also
MatrixBase::fullPivLu(), MatrixBase::determinant(), MatrixBase::inverse()

Member Typedef Documentation

◆ AdjointReturnType

◆ Base

template<typename _MatrixType >
typedef SolverBase<FullPivLU> Eigen::FullPivLU< _MatrixType >::Base

◆ CoeffReturnType

typedef Scalar Eigen::SolverBase< FullPivLU< _MatrixType > >::CoeffReturnType
inherited

◆ ConstTransposeReturnType

typedef internal::add_const<Transpose<constDerived>>::type Eigen::SolverBase< FullPivLU< _MatrixType > >::ConstTransposeReturnType
inherited

◆ Index

template<typename Derived >
typedef Eigen::Index Eigen::EigenBase< Derived >::Index
inherited

The interface type of indices.

To change this, #define the preprocessor symbol EIGEN_DEFAULT_DENSE_INDEX_TYPE.

See also
StorageIndex, TopicPreprocessorDirectives.

◆ IntColVectorType

template<typename _MatrixType >
typedef internal::plain_col_type<MatrixType,StorageIndex>::type Eigen::FullPivLU< _MatrixType >::IntColVectorType

◆ IntRowVectorType

template<typename _MatrixType >
typedef internal::plain_row_type<MatrixType,StorageIndex>::type Eigen::FullPivLU< _MatrixType >::IntRowVectorType

◆ MatrixType

template<typename _MatrixType >
typedef _MatrixType Eigen::FullPivLU< _MatrixType >::MatrixType

◆ PermutationPType

template<typename _MatrixType >
typedef PermutationMatrix<RowsAtCompileTime, MaxRowsAtCompileTime> Eigen::FullPivLU< _MatrixType >::PermutationPType

◆ PermutationQType

template<typename _MatrixType >
typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime> Eigen::FullPivLU< _MatrixType >::PermutationQType

◆ PlainObject

template<typename _MatrixType >
typedef MatrixType::PlainObject Eigen::FullPivLU< _MatrixType >::PlainObject

◆ Scalar

typedef internal::traits<FullPivLU< _MatrixType > >::Scalar Eigen::SolverBase< FullPivLU< _MatrixType > >::Scalar
inherited

◆ StorageKind

template<typename Derived >
typedef internal::traits<Derived>::StorageKind Eigen::EigenBase< Derived >::StorageKind
inherited

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
inherited
49 {
50 RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
51 ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
52 SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,
53 internal::traits<Derived>::ColsAtCompileTime>::ret),
54 MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
55 MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
56 MaxSizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::MaxRowsAtCompileTime,
57 internal::traits<Derived>::MaxColsAtCompileTime>::ret),
58 IsVectorAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime == 1
59 || internal::traits<Derived>::MaxColsAtCompileTime == 1
60 };
@ RowsAtCompileTime
Definition SolverBase.h:50
@ ColsAtCompileTime
Definition SolverBase.h:51
@ IsVectorAtCompileTime
Definition SolverBase.h:58
@ SizeAtCompileTime
Definition SolverBase.h:52

◆ anonymous enum

template<typename _MatrixType >
anonymous enum
Enumerator
MaxRowsAtCompileTime 
MaxColsAtCompileTime 
68 {
69 MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
70 MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
71 };
@ MaxColsAtCompileTime
Definition FullPivLU.h:70
@ MaxRowsAtCompileTime
Definition FullPivLU.h:69

Constructor & Destructor Documentation

◆ FullPivLU() [1/4]

template<typename MatrixType >
Eigen::FullPivLU< MatrixType >::FullPivLU

Default Constructor.

The default constructor is useful in cases in which the user intends to perform decompositions via LU::compute(const MatrixType&).

446{
447}
bool m_usePrescribedThreshold
Definition FullPivLU.h:440
bool m_isInitialized
Definition FullPivLU.h:440

◆ FullPivLU() [2/4]

template<typename MatrixType >
Eigen::FullPivLU< MatrixType >::FullPivLU ( Index  rows,
Index  cols 
)

Default Constructor with memory preallocation.

Like the default constructor but with preallocation of the internal data according to the specified problem size.

See also
FullPivLU()
451 : m_lu(rows, cols),
452 m_p(rows),
453 m_q(cols),
456 m_isInitialized(false),
458{
459}
PermutationQType m_q
Definition FullPivLU.h:433
PermutationPType m_p
Definition FullPivLU.h:432
EIGEN_DEVICE_FUNC Index rows() const
Definition FullPivLU.h:409
MatrixType m_lu
Definition FullPivLU.h:431
IntRowVectorType m_colsTranspositions
Definition FullPivLU.h:435
IntColVectorType m_rowsTranspositions
Definition FullPivLU.h:434
EIGEN_DEVICE_FUNC Index cols() const
Definition FullPivLU.h:410

◆ FullPivLU() [3/4]

template<typename MatrixType >
template<typename InputType >
Eigen::FullPivLU< MatrixType >::FullPivLU ( const EigenBase< InputType > &  matrix)
explicit

Constructor.

Parameters
matrixthe matrix of which to compute the LU decomposition. It is required to be nonzero.
464 : m_lu(matrix.rows(), matrix.cols()),
465 m_p(matrix.rows()),
466 m_q(matrix.cols()),
467 m_rowsTranspositions(matrix.rows()),
468 m_colsTranspositions(matrix.cols()),
469 m_isInitialized(false),
471{
472 compute(matrix.derived());
473}
FullPivLU & compute(const EigenBase< InputType > &matrix)
Definition FullPivLU.h:119

References Eigen::FullPivLU< _MatrixType >::compute(), and Eigen::EigenBase< Derived >::derived().

+ Here is the call graph for this function:

◆ FullPivLU() [4/4]

template<typename MatrixType >
template<typename InputType >
Eigen::FullPivLU< MatrixType >::FullPivLU ( EigenBase< InputType > &  matrix)
explicit

Constructs a LU factorization from a given matrix.

This overloaded constructor is provided for inplace decomposition when MatrixType is a Eigen::Ref.

See also
FullPivLU(const EigenBase&)
478 : m_lu(matrix.derived()),
479 m_p(matrix.rows()),
480 m_q(matrix.cols()),
481 m_rowsTranspositions(matrix.rows()),
482 m_colsTranspositions(matrix.cols()),
483 m_isInitialized(false),
485{
487}
void computeInPlace()
Definition FullPivLU.h:490

References Eigen::FullPivLU< _MatrixType >::computeInPlace().

+ Here is the call graph for this function:

Member Function Documentation

◆ _solve_impl() [1/2]

template<typename _MatrixType >
template<typename RhsType , typename DstType >
EIGEN_DEVICE_FUNC void Eigen::FullPivLU< _MatrixType >::_solve_impl ( const RhsType &  rhs,
DstType &  dst 
) const

◆ _solve_impl() [2/2]

template<typename _MatrixType >
template<typename RhsType , typename DstType >
void Eigen::FullPivLU< _MatrixType >::_solve_impl ( const RhsType &  rhs,
DstType &  dst 
) const
748{
749 /* The decomposition PAQ = LU can be rewritten as A = P^{-1} L U Q^{-1}.
750 * So we proceed as follows:
751 * Step 1: compute c = P * rhs.
752 * Step 2: replace c by the solution x to Lx = c. Exists because L is invertible.
753 * Step 3: replace c by the solution x to Ux = c. May or may not exist.
754 * Step 4: result = Q * c;
755 */
756
757 const Index rows = this->rows(),
758 cols = this->cols(),
759 nonzero_pivots = this->rank();
760 eigen_assert(rhs.rows() == rows);
761 const Index smalldim = (std::min)(rows, cols);
762
763 if(nonzero_pivots == 0)
764 {
765 dst.setZero();
766 return;
767 }
768
769 typename RhsType::PlainObject c(rhs.rows(), rhs.cols());
770
771 // Step 1
772 c = permutationP() * rhs;
773
774 // Step 2
775 m_lu.topLeftCorner(smalldim,smalldim)
776 .template triangularView<UnitLower>()
777 .solveInPlace(c.topRows(smalldim));
778 if(rows>cols)
779 c.bottomRows(rows-cols) -= m_lu.bottomRows(rows-cols) * c.topRows(cols);
780
781 // Step 3
782 m_lu.topLeftCorner(nonzero_pivots, nonzero_pivots)
783 .template triangularView<Upper>()
784 .solveInPlace(c.topRows(nonzero_pivots));
785
786 // Step 4
787 for(Index i = 0; i < nonzero_pivots; ++i)
788 dst.row(permutationQ().indices().coeff(i)) = c.row(i);
789 for(Index i = nonzero_pivots; i < m_lu.cols(); ++i)
790 dst.row(permutationQ().indices().coeff(i)).setZero();
791}
#define eigen_assert(x)
Definition Macros.h:579
Index rank() const
Definition FullPivLU.h:332
EIGEN_DEVICE_FUNC const PermutationPType & permutationP() const
Definition FullPivLU.h:159
const PermutationQType & permutationQ() const
Definition FullPivLU.h:169
Eigen::Index Index
The interface type of indices.
Definition EigenBase.h:38

References eigen_assert.

◆ _solve_impl_transposed() [1/2]

template<typename _MatrixType >
template<bool Conjugate, typename RhsType , typename DstType >
EIGEN_DEVICE_FUNC void Eigen::FullPivLU< _MatrixType >::_solve_impl_transposed ( const RhsType &  rhs,
DstType &  dst 
) const

◆ _solve_impl_transposed() [2/2]

template<typename _MatrixType >
template<bool Conjugate, typename RhsType , typename DstType >
void Eigen::FullPivLU< _MatrixType >::_solve_impl_transposed ( const RhsType &  rhs,
DstType &  dst 
) const
796{
797 /* The decomposition PAQ = LU can be rewritten as A = P^{-1} L U Q^{-1},
798 * and since permutations are real and unitary, we can write this
799 * as A^T = Q U^T L^T P,
800 * So we proceed as follows:
801 * Step 1: compute c = Q^T rhs.
802 * Step 2: replace c by the solution x to U^T x = c. May or may not exist.
803 * Step 3: replace c by the solution x to L^T x = c.
804 * Step 4: result = P^T c.
805 * If Conjugate is true, replace "^T" by "^*" above.
806 */
807
808 const Index rows = this->rows(), cols = this->cols(),
809 nonzero_pivots = this->rank();
810 eigen_assert(rhs.rows() == cols);
811 const Index smalldim = (std::min)(rows, cols);
812
813 if(nonzero_pivots == 0)
814 {
815 dst.setZero();
816 return;
817 }
818
819 typename RhsType::PlainObject c(rhs.rows(), rhs.cols());
820
821 // Step 1
822 c = permutationQ().inverse() * rhs;
823
824 if (Conjugate) {
825 // Step 2
826 m_lu.topLeftCorner(nonzero_pivots, nonzero_pivots)
827 .template triangularView<Upper>()
828 .adjoint()
829 .solveInPlace(c.topRows(nonzero_pivots));
830 // Step 3
831 m_lu.topLeftCorner(smalldim, smalldim)
832 .template triangularView<UnitLower>()
833 .adjoint()
834 .solveInPlace(c.topRows(smalldim));
835 } else {
836 // Step 2
837 m_lu.topLeftCorner(nonzero_pivots, nonzero_pivots)
838 .template triangularView<Upper>()
839 .transpose()
840 .solveInPlace(c.topRows(nonzero_pivots));
841 // Step 3
842 m_lu.topLeftCorner(smalldim, smalldim)
843 .template triangularView<UnitLower>()
844 .transpose()
845 .solveInPlace(c.topRows(smalldim));
846 }
847
848 // Step 4
849 PermutationPType invp = permutationP().inverse().eval();
850 for(Index i = 0; i < smalldim; ++i)
851 dst.row(invp.indices().coeff(i)) = c.row(i);
852 for(Index i = smalldim; i < rows; ++i)
853 dst.row(invp.indices().coeff(i)).setZero();
854}
PermutationMatrix< RowsAtCompileTime, MaxRowsAtCompileTime > PermutationPType
Definition FullPivLU.h:75
InverseReturnType inverse() const
Definition PermutationMatrix.h:196

References eigen_assert, Eigen::PermutationMatrix< SizeAtCompileTime, MaxSizeAtCompileTime, _StorageIndex >::indices(), and Eigen::PermutationBase< Derived >::inverse().

+ Here is the call graph for this function:

◆ addTo()

template<typename Derived >
template<typename Dest >
EIGEN_DEVICE_FUNC void Eigen::EigenBase< Derived >::addTo ( Dest &  dst) const
inlineinherited
78 {
79 // This is the default implementation,
80 // derived class can reimplement it in a more optimized way.
81 typename Dest::PlainObject res(rows(),cols());
82 evalTo(res);
83 dst += res;
84 }
EIGEN_DEVICE_FUNC Index cols() const
Definition EigenBase.h:62
EIGEN_DEVICE_FUNC Index rows() const
Definition EigenBase.h:59
EIGEN_DEVICE_FUNC void evalTo(Dest &dst) const
Definition EigenBase.h:71

◆ adjoint()

AdjointReturnType Eigen::SolverBase< FullPivLU< _MatrixType > >::adjoint ( ) const
inlineinherited
Returns
an expression of the adjoint of the factored matrix

A typical usage is to solve for the adjoint problem A' x = b:

x = dec.adjoint().solve(b);

For real scalar types, this function is equivalent to transpose().

See also
transpose(), solve()
110 {
112 }
internal::conditional< NumTraits< Scalar >::IsComplex, CwiseUnaryOp< internal::scalar_conjugate_op< Scalar >, ConstTransposeReturnType >, ConstTransposeReturnType >::type AdjointReturnType
Definition SolverBase.h:99
ConstTransposeReturnType transpose() const
Definition SolverBase.h:90
EIGEN_DEVICE_FUNC FullPivLU< _MatrixType > & derived()
Definition EigenBase.h:45

◆ applyThisOnTheLeft()

template<typename Derived >
template<typename Dest >
EIGEN_DEVICE_FUNC void Eigen::EigenBase< Derived >::applyThisOnTheLeft ( Dest &  dst) const
inlineinherited
110 {
111 // This is the default implementation,
112 // derived class can reimplement it in a more optimized way.
113 dst = this->derived() * dst;
114 }
EIGEN_DEVICE_FUNC Derived & derived()
Definition EigenBase.h:45

References Eigen::EigenBase< Derived >::derived().

+ Here is the call graph for this function:

◆ applyThisOnTheRight()

template<typename Derived >
template<typename Dest >
EIGEN_DEVICE_FUNC void Eigen::EigenBase< Derived >::applyThisOnTheRight ( Dest &  dst) const
inlineinherited
101 {
102 // This is the default implementation,
103 // derived class can reimplement it in a more optimized way.
104 dst = dst * this->derived();
105 }

References Eigen::EigenBase< Derived >::derived().

+ Here is the call graph for this function:

◆ check_template_parameters()

template<typename _MatrixType >
static void Eigen::FullPivLU< _MatrixType >::check_template_parameters ( )
inlinestaticprotected
425 {
427 }
#define EIGEN_STATIC_ASSERT_NON_INTEGER(TYPE)
Definition StaticAssert.h:184
internal::traits< FullPivLU< _MatrixType > >::Scalar Scalar
Definition SolverBase.h:46

References EIGEN_STATIC_ASSERT_NON_INTEGER.

◆ cols()

template<typename _MatrixType >
EIGEN_DEVICE_FUNC Index Eigen::FullPivLU< _MatrixType >::cols ( ) const
inline
410{ return m_lu.cols(); }

References Eigen::FullPivLU< _MatrixType >::m_lu.

Referenced by Eigen::FullPivLU< _MatrixType >::dimensionOfKernel(), and Eigen::FullPivLU< _MatrixType >::isInjective().

+ Here is the caller graph for this function:

◆ compute()

template<typename _MatrixType >
template<typename InputType >
FullPivLU & Eigen::FullPivLU< _MatrixType >::compute ( const EigenBase< InputType > &  matrix)
inline

Computes the LU decomposition of the given matrix.

Parameters
matrixthe matrix of which to compute the LU decomposition. It is required to be nonzero.
Returns
a reference to *this
119 {
120 m_lu = matrix.derived();
122 return *this;
123 }

References Eigen::FullPivLU< _MatrixType >::computeInPlace(), Eigen::EigenBase< Derived >::derived(), and Eigen::FullPivLU< _MatrixType >::m_lu.

Referenced by Eigen::FullPivLU< _MatrixType >::FullPivLU().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ computeInPlace()

template<typename MatrixType >
void Eigen::FullPivLU< MatrixType >::computeInPlace
protected
491{
493
494 // the permutations are stored as int indices, so just to be sure:
495 eigen_assert(m_lu.rows()<=NumTraits<int>::highest() && m_lu.cols()<=NumTraits<int>::highest());
496
497 m_l1_norm = m_lu.cwiseAbs().colwise().sum().maxCoeff();
498
499 const Index size = m_lu.diagonalSize();
500 const Index rows = m_lu.rows();
501 const Index cols = m_lu.cols();
502
503 // will store the transpositions, before we accumulate them at the end.
504 // can't accumulate on-the-fly because that will be done in reverse order for the rows.
505 m_rowsTranspositions.resize(m_lu.rows());
506 m_colsTranspositions.resize(m_lu.cols());
507 Index number_of_transpositions = 0; // number of NONTRIVIAL transpositions, i.e. m_rowsTranspositions[i]!=i
508
509 m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
510 m_maxpivot = RealScalar(0);
511
512 for(Index k = 0; k < size; ++k)
513 {
514 // First, we need to find the pivot.
515
516 // biggest coefficient in the remaining bottom-right corner (starting at row k, col k)
517 Index row_of_biggest_in_corner, col_of_biggest_in_corner;
518 typedef internal::scalar_score_coeff_op<Scalar> Scoring;
519 typedef typename Scoring::result_type Score;
520 Score biggest_in_corner;
521 biggest_in_corner = m_lu.bottomRightCorner(rows-k, cols-k)
522 .unaryExpr(Scoring())
523 .maxCoeff(&row_of_biggest_in_corner, &col_of_biggest_in_corner);
524 row_of_biggest_in_corner += k; // correct the values! since they were computed in the corner,
525 col_of_biggest_in_corner += k; // need to add k to them.
526
527 if(biggest_in_corner==Score(0))
528 {
529 // before exiting, make sure to initialize the still uninitialized transpositions
530 // in a sane state without destroying what we already have.
532 for(Index i = k; i < size; ++i)
533 {
534 m_rowsTranspositions.coeffRef(i) = i;
535 m_colsTranspositions.coeffRef(i) = i;
536 }
537 break;
538 }
539
540 RealScalar abs_pivot = internal::abs_knowing_score<Scalar>()(m_lu(row_of_biggest_in_corner, col_of_biggest_in_corner), biggest_in_corner);
541 if(abs_pivot > m_maxpivot) m_maxpivot = abs_pivot;
542
543 // Now that we've found the pivot, we need to apply the row/col swaps to
544 // bring it to the location (k,k).
545
546 m_rowsTranspositions.coeffRef(k) = row_of_biggest_in_corner;
547 m_colsTranspositions.coeffRef(k) = col_of_biggest_in_corner;
548 if(k != row_of_biggest_in_corner) {
549 m_lu.row(k).swap(m_lu.row(row_of_biggest_in_corner));
550 ++number_of_transpositions;
551 }
552 if(k != col_of_biggest_in_corner) {
553 m_lu.col(k).swap(m_lu.col(col_of_biggest_in_corner));
554 ++number_of_transpositions;
555 }
556
557 // Now that the pivot is at the right location, we update the remaining
558 // bottom-right corner by Gaussian elimination.
559
560 if(k<rows-1)
561 m_lu.col(k).tail(rows-k-1) /= m_lu.coeff(k,k);
562 if(k<size-1)
563 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);
564 }
565
566 // the main loop is over, we still have to accumulate the transpositions to find the
567 // permutations P and Q
568
570 for(Index k = size-1; k >= 0; --k)
572
574 for(Index k = 0; k < size; ++k)
576
577 m_det_pq = (number_of_transpositions%2) ? -1 : 1;
578
579 m_isInitialized = true;
580}
signed char m_det_pq
Definition FullPivLU.h:439
RealScalar m_maxpivot
Definition FullPivLU.h:438
RealScalar m_l1_norm
Definition FullPivLU.h:437
static void check_template_parameters()
Definition FullPivLU.h:424
Index m_nonzero_pivots
Definition FullPivLU.h:436
Derived & applyTranspositionOnTheRight(Index i, Index j)
Definition PermutationMatrix.h:185
void setIdentity()
Definition PermutationMatrix.h:142
EIGEN_DEVICE_FUNC Index size() const
Definition EigenBase.h:66

References eigen_assert.

Referenced by Eigen::FullPivLU< _MatrixType >::FullPivLU(), and Eigen::FullPivLU< _MatrixType >::compute().

+ Here is the caller graph for this function:

◆ const_cast_derived()

template<typename Derived >
EIGEN_DEVICE_FUNC Derived & Eigen::EigenBase< Derived >::const_cast_derived ( ) const
inlineinherited
52 { return *static_cast<Derived*>(const_cast<EigenBase*>(this)); }

Referenced by Eigen::TriangularViewImpl< _MatrixType, _Mode, Dense >::swap().

+ Here is the caller graph for this function:

◆ const_derived()

template<typename Derived >
EIGEN_DEVICE_FUNC const Derived & Eigen::EigenBase< Derived >::const_derived ( ) const
inlineinherited
55 { return *static_cast<const Derived*>(this); }

◆ derived() [1/2]

EIGEN_DEVICE_FUNC FullPivLU< _MatrixType > & Eigen::EigenBase< FullPivLU< _MatrixType > >::derived ( )
inlineinherited
Returns
a reference to the derived object
45{ return *static_cast<Derived*>(this); }

◆ derived() [2/2]

EIGEN_DEVICE_FUNC const FullPivLU< _MatrixType > & Eigen::EigenBase< FullPivLU< _MatrixType > >::derived ( ) const
inlineinherited
Returns
a const reference to the derived object
48{ return *static_cast<const Derived*>(this); }

◆ determinant()

Returns
the determinant of the matrix of which *this is the LU decomposition. It has only linear complexity (that is, O(n) where n is the dimension of the square matrix) as the LU decomposition has already been computed.
Note
This is only for square matrices.
For fixed-size matrices of size up to 4, MatrixBase::determinant() offers optimized paths.
Warning
a determinant can be very big or small, so for matrices of large enough dimension, there is a risk of overflow/underflow.
See also
MatrixBase::determinant()
584{
585 eigen_assert(m_isInitialized && "LU is not initialized.");
586 eigen_assert(m_lu.rows() == m_lu.cols() && "You can't take the determinant of a non-square matrix!");
587 return Scalar(m_det_pq) * Scalar(m_lu.diagonal().prod());
588}

References eigen_assert.

◆ dimensionOfKernel()

template<typename _MatrixType >
Index Eigen::FullPivLU< _MatrixType >::dimensionOfKernel ( ) const
inline
Returns
the dimension of the kernel of the matrix of which *this is the LU decomposition.
Note
This method has to determine which pivots should be considered nonzero. For that, it uses the threshold value that you can control by calling setThreshold(const RealScalar&).
350 {
351 eigen_assert(m_isInitialized && "LU is not initialized.");
352 return cols() - rank();
353 }

References Eigen::FullPivLU< _MatrixType >::cols(), eigen_assert, Eigen::FullPivLU< _MatrixType >::m_isInitialized, and Eigen::FullPivLU< _MatrixType >::rank().

+ Here is the call graph for this function:

◆ evalTo()

template<typename Derived >
template<typename Dest >
EIGEN_DEVICE_FUNC void Eigen::EigenBase< Derived >::evalTo ( Dest &  dst) const
inlineinherited
72 { derived().evalTo(dst); }

Referenced by Eigen::EigenBase< Derived >::subTo().

+ Here is the caller graph for this function:

◆ image()

template<typename _MatrixType >
const internal::image_retval< FullPivLU > Eigen::FullPivLU< _MatrixType >::image ( const MatrixType originalMatrix) const
inline
Returns
the image of the matrix, also called its column-space. The columns of the returned matrix will form a basis of the image (column-space).
Parameters
originalMatrixthe original matrix, of which *this is the LU decomposition. The reason why it is needed to pass it here, is that this allows a large optimization, as otherwise this method would need to reconstruct it from the LU decomposition.
Note
If the image has dimension zero, then the returned matrix is a column-vector filled with zeros.
This method has to determine which pivots should be considered nonzero. For that, it uses the threshold value that you can control by calling setThreshold(const RealScalar&).

Example:

Output:

See also
kernel()
216 {
217 eigen_assert(m_isInitialized && "LU is not initialized.");
218 return internal::image_retval<FullPivLU>(*this, originalMatrix);
219 }

References eigen_assert, and Eigen::FullPivLU< _MatrixType >::m_isInitialized.

◆ inverse()

template<typename _MatrixType >
const Inverse< FullPivLU > Eigen::FullPivLU< _MatrixType >::inverse ( ) const
inline
Returns
the inverse of the matrix of which *this is the LU decomposition.
Note
If this matrix is not invertible, the returned matrix has undefined coefficients. Use isInvertible() to first determine whether this matrix is invertible.
See also
MatrixBase::inverse()
401 {
402 eigen_assert(m_isInitialized && "LU is not initialized.");
403 eigen_assert(m_lu.rows() == m_lu.cols() && "You can't take the inverse of a non-square matrix!");
404 return Inverse<FullPivLU>(*this);
405 }

References eigen_assert, Eigen::FullPivLU< _MatrixType >::m_isInitialized, and Eigen::FullPivLU< _MatrixType >::m_lu.

◆ isInjective()

template<typename _MatrixType >
bool Eigen::FullPivLU< _MatrixType >::isInjective ( ) const
inline
Returns
true if the matrix of which *this is the LU decomposition represents an injective linear map, i.e. has trivial kernel; false otherwise.
Note
This method has to determine which pivots should be considered nonzero. For that, it uses the threshold value that you can control by calling setThreshold(const RealScalar&).
363 {
364 eigen_assert(m_isInitialized && "LU is not initialized.");
365 return rank() == cols();
366 }

References Eigen::FullPivLU< _MatrixType >::cols(), eigen_assert, Eigen::FullPivLU< _MatrixType >::m_isInitialized, and Eigen::FullPivLU< _MatrixType >::rank().

Referenced by Eigen::FullPivLU< _MatrixType >::isInvertible().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ isInvertible()

template<typename _MatrixType >
bool Eigen::FullPivLU< _MatrixType >::isInvertible ( ) const
inline
Returns
true if the matrix of which *this is the LU decomposition is invertible.
Note
This method has to determine which pivots should be considered nonzero. For that, it uses the threshold value that you can control by calling setThreshold(const RealScalar&).
388 {
389 eigen_assert(m_isInitialized && "LU is not initialized.");
390 return isInjective() && (m_lu.rows() == m_lu.cols());
391 }
bool isInjective() const
Definition FullPivLU.h:362

References eigen_assert, Eigen::FullPivLU< _MatrixType >::isInjective(), Eigen::FullPivLU< _MatrixType >::m_isInitialized, and Eigen::FullPivLU< _MatrixType >::m_lu.

+ Here is the call graph for this function:

◆ isSurjective()

template<typename _MatrixType >
bool Eigen::FullPivLU< _MatrixType >::isSurjective ( ) const
inline
Returns
true if the matrix of which *this is the LU decomposition represents a surjective linear map; false otherwise.
Note
This method has to determine which pivots should be considered nonzero. For that, it uses the threshold value that you can control by calling setThreshold(const RealScalar&).
376 {
377 eigen_assert(m_isInitialized && "LU is not initialized.");
378 return rank() == rows();
379 }

References eigen_assert, Eigen::FullPivLU< _MatrixType >::m_isInitialized, Eigen::FullPivLU< _MatrixType >::rank(), and Eigen::FullPivLU< _MatrixType >::rows().

+ Here is the call graph for this function:

◆ kernel()

template<typename _MatrixType >
const internal::kernel_retval< FullPivLU > Eigen::FullPivLU< _MatrixType >::kernel ( ) const
inline
Returns
the kernel of the matrix, also called its null-space. The columns of the returned matrix will form a basis of the kernel.
Note
If the kernel has dimension zero, then the returned matrix is a column-vector filled with zeros.
This method has to determine which pivots should be considered nonzero. For that, it uses the threshold value that you can control by calling setThreshold(const RealScalar&).

Example:

Output:

See also
image()
190 {
191 eigen_assert(m_isInitialized && "LU is not initialized.");
192 return internal::kernel_retval<FullPivLU>(*this);
193 }

References eigen_assert, and Eigen::FullPivLU< _MatrixType >::m_isInitialized.

◆ matrixLU()

template<typename _MatrixType >
const MatrixType & Eigen::FullPivLU< _MatrixType >::matrixLU ( ) const
inline
Returns
the LU decomposition matrix: the upper-triangular part is U, the unit-lower-triangular part is L (at least for square matrices; in the non-square case, special care is needed, see the documentation of class FullPivLU).
See also
matrixL(), matrixU()
132 {
133 eigen_assert(m_isInitialized && "LU is not initialized.");
134 return m_lu;
135 }

References eigen_assert, Eigen::FullPivLU< _MatrixType >::m_isInitialized, and Eigen::FullPivLU< _MatrixType >::m_lu.

◆ maxPivot()

template<typename _MatrixType >
RealScalar Eigen::FullPivLU< _MatrixType >::maxPivot ( ) const
inline
Returns
the absolute value of the biggest pivot, i.e. the biggest diagonal coefficient of U.
153{ return m_maxpivot; }

References Eigen::FullPivLU< _MatrixType >::m_maxpivot.

◆ nonzeroPivots()

template<typename _MatrixType >
Index Eigen::FullPivLU< _MatrixType >::nonzeroPivots ( ) const
inline
Returns
the number of nonzero pivots in the LU decomposition. Here nonzero is meant in the exact sense, not in a fuzzy sense. So that notion isn't really intrinsically interesting, but it is still useful when implementing algorithms.
See also
rank()
145 {
146 eigen_assert(m_isInitialized && "LU is not initialized.");
147 return m_nonzero_pivots;
148 }

References eigen_assert, Eigen::FullPivLU< _MatrixType >::m_isInitialized, and Eigen::FullPivLU< _MatrixType >::m_nonzero_pivots.

◆ permutationP()

template<typename _MatrixType >
EIGEN_DEVICE_FUNC const PermutationPType & Eigen::FullPivLU< _MatrixType >::permutationP ( ) const
inline
Returns
the permutation matrix P
See also
permutationQ()
160 {
161 eigen_assert(m_isInitialized && "LU is not initialized.");
162 return m_p;
163 }

References eigen_assert, Eigen::FullPivLU< _MatrixType >::m_isInitialized, and Eigen::FullPivLU< _MatrixType >::m_p.

◆ permutationQ()

template<typename _MatrixType >
const PermutationQType & Eigen::FullPivLU< _MatrixType >::permutationQ ( ) const
inline
Returns
the permutation matrix Q
See also
permutationP()
170 {
171 eigen_assert(m_isInitialized && "LU is not initialized.");
172 return m_q;
173 }

References eigen_assert, Eigen::FullPivLU< _MatrixType >::m_isInitialized, and Eigen::FullPivLU< _MatrixType >::m_q.

◆ rank()

template<typename _MatrixType >
Index Eigen::FullPivLU< _MatrixType >::rank ( ) const
inline
Returns
the rank of the matrix of which *this is the LU decomposition.
Note
This method has to determine which pivots should be considered nonzero. For that, it uses the threshold value that you can control by calling setThreshold(const RealScalar&).
333 {
334 using std::abs;
335 eigen_assert(m_isInitialized && "LU is not initialized.");
336 RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
337 Index result = 0;
338 for(Index i = 0; i < m_nonzero_pivots; ++i)
339 result += (abs(m_lu.coeff(i,i)) > premultiplied_threshold);
340 return result;
341 }
RealScalar threshold() const
Definition FullPivLU.h:317
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half abs(const half &a)
Definition Half.h:445

References eigen_assert, Eigen::FullPivLU< _MatrixType >::m_isInitialized, Eigen::FullPivLU< _MatrixType >::m_lu, Eigen::FullPivLU< _MatrixType >::m_maxpivot, Eigen::FullPivLU< _MatrixType >::m_nonzero_pivots, and Eigen::FullPivLU< _MatrixType >::threshold().

Referenced by Eigen::FullPivLU< _MatrixType >::dimensionOfKernel(), Eigen::FullPivLU< _MatrixType >::isInjective(), and Eigen::FullPivLU< _MatrixType >::isSurjective().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ rcond()

template<typename _MatrixType >
RealScalar Eigen::FullPivLU< _MatrixType >::rcond ( ) const
inline
Returns
an estimate of the reciprocal condition number of the matrix of which *this is the LU decomposition.
253 {
254 eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
256 }
Decomposition::RealScalar rcond_estimate_helper(typename Decomposition::RealScalar matrix_norm, const Decomposition &dec)
Reciprocal condition number estimator.
Definition ConditionEstimator.h:159

References eigen_assert, Eigen::FullPivLU< _MatrixType >::m_isInitialized, Eigen::FullPivLU< _MatrixType >::m_l1_norm, and Eigen::internal::rcond_estimate_helper().

+ Here is the call graph for this function:

◆ reconstructedMatrix()

template<typename MatrixType >
MatrixType Eigen::FullPivLU< MatrixType >::reconstructedMatrix
Returns
the matrix represented by the decomposition, i.e., it returns the product: $ P^{-1} L U Q^{-1} $. This function is provided for debug purposes.
595{
596 eigen_assert(m_isInitialized && "LU is not initialized.");
597 const Index smalldim = (std::min)(m_lu.rows(), m_lu.cols());
598 // LU
599 MatrixType res(m_lu.rows(),m_lu.cols());
600 // FIXME the .toDenseMatrix() should not be needed...
601 res = m_lu.leftCols(smalldim)
602 .template triangularView<UnitLower>().toDenseMatrix()
603 * m_lu.topRows(smalldim)
604 .template triangularView<Upper>().toDenseMatrix();
605
606 // P^{-1}(LU)
607 res = m_p.inverse() * res;
608
609 // (P^{-1}LU)Q^{-1}
610 res = res * m_q.inverse();
611
612 return res;
613}
_MatrixType MatrixType
Definition FullPivLU.h:63

References eigen_assert.

◆ rows()

template<typename _MatrixType >
EIGEN_DEVICE_FUNC Index Eigen::FullPivLU< _MatrixType >::rows ( ) const
inline
409{ return m_lu.rows(); }

References Eigen::FullPivLU< _MatrixType >::m_lu.

Referenced by Eigen::FullPivLU< _MatrixType >::isSurjective().

+ Here is the caller graph for this function:

◆ setThreshold() [1/2]

template<typename _MatrixType >
FullPivLU & Eigen::FullPivLU< _MatrixType >::setThreshold ( const RealScalar &  threshold)
inline

Allows to prescribe a threshold to be used by certain methods, such as rank(), who need to determine when pivots are to be considered nonzero. This is not used for the LU decomposition itself.

When it needs to get the threshold value, Eigen calls threshold(). By default, this uses a formula to automatically determine a reasonable threshold. Once you have called the present method setThreshold(const RealScalar&), your value is used instead.

Parameters
thresholdThe new value to use as the threshold.

A pivot will be considered nonzero if its absolute value is strictly greater than $ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert $ where maxpivot is the biggest pivot.

If you want to come back to the default behavior, call setThreshold(Default_t)

293 {
296 return *this;
297 }
RealScalar m_prescribedThreshold
Definition FullPivLU.h:438

References Eigen::FullPivLU< _MatrixType >::m_prescribedThreshold, Eigen::FullPivLU< _MatrixType >::m_usePrescribedThreshold, and Eigen::FullPivLU< _MatrixType >::threshold().

+ Here is the call graph for this function:

◆ setThreshold() [2/2]

template<typename _MatrixType >
FullPivLU & Eigen::FullPivLU< _MatrixType >::setThreshold ( Default_t  )
inline

Allows to come back to the default behavior, letting Eigen use its default formula for determining the threshold.

You should pass the special object Eigen::Default as parameter here.

lu.setThreshold(Eigen::Default);
@ Default
Definition Constants.h:352

See the documentation of setThreshold(const RealScalar&).

308 {
310 return *this;
311 }

References Eigen::FullPivLU< _MatrixType >::m_usePrescribedThreshold.

◆ size()

template<typename Derived >
EIGEN_DEVICE_FUNC Index Eigen::EigenBase< Derived >::size ( ) const
inlineinherited
Returns
the number of coefficients, which is rows()*cols().
See also
rows(), cols(), SizeAtCompileTime.
66{ return rows() * cols(); }

References Eigen::EigenBase< Derived >::cols(), and Eigen::EigenBase< Derived >::rows().

Referenced by Eigen::PlainObjectBase< Derived >::_resize_to_match(), Eigen::DiagonalMatrix< _Scalar, SizeAtCompileTime, MaxSizeAtCompileTime >::resize(), Eigen::DiagonalMatrix< _Scalar, SizeAtCompileTime, MaxSizeAtCompileTime >::setIdentity(), and Eigen::DiagonalMatrix< _Scalar, SizeAtCompileTime, MaxSizeAtCompileTime >::setZero().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ solve()

template<typename _MatrixType >
template<typename Rhs >
const Solve< FullPivLU, Rhs > Eigen::FullPivLU< _MatrixType >::solve ( const MatrixBase< Rhs > &  b) const
inline
Returns
a solution x to the equation Ax=b, where A is the matrix of which *this is the LU decomposition.
Parameters
bthe right-hand-side of the equation to solve. Can be a vector or a matrix, the only requirement in order for the equation to make sense is that b.rows()==A.rows(), where A is the matrix of which *this is the LU decomposition.
Returns
a solution.

\note_about_checking_solutions

\note_about_arbitrary_choice_of_solution \note_about_using_kernel_to_study_multiple_solutions

Example:

Output:

See also
TriangularView::solve(), kernel(), inverse()
244 {
245 eigen_assert(m_isInitialized && "LU is not initialized.");
246 return Solve<FullPivLU, Rhs>(*this, b.derived());
247 }

References eigen_assert, and Eigen::FullPivLU< _MatrixType >::m_isInitialized.

◆ subTo()

template<typename Derived >
template<typename Dest >
EIGEN_DEVICE_FUNC void Eigen::EigenBase< Derived >::subTo ( Dest &  dst) const
inlineinherited
90 {
91 // This is the default implementation,
92 // derived class can reimplement it in a more optimized way.
93 typename Dest::PlainObject res(rows(),cols());
94 evalTo(res);
95 dst -= res;
96 }

References Eigen::EigenBase< Derived >::cols(), Eigen::EigenBase< Derived >::evalTo(), and Eigen::EigenBase< Derived >::rows().

+ Here is the call graph for this function:

◆ threshold()

template<typename _MatrixType >
RealScalar Eigen::FullPivLU< _MatrixType >::threshold ( ) const
inline

Returns the threshold that will be used by certain methods such as rank().

See the documentation of setThreshold(const RealScalar&).

318 {
321 // this formula comes from experimenting (see "LU precision tuning" thread on the list)
322 // and turns out to be identical to Higham's formula used already in LDLt.
323 : NumTraits<Scalar>::epsilon() * m_lu.diagonalSize();
324 }

References eigen_assert, Eigen::FullPivLU< _MatrixType >::m_isInitialized, Eigen::FullPivLU< _MatrixType >::m_lu, Eigen::FullPivLU< _MatrixType >::m_prescribedThreshold, and Eigen::FullPivLU< _MatrixType >::m_usePrescribedThreshold.

Referenced by Eigen::FullPivLU< _MatrixType >::rank(), and Eigen::FullPivLU< _MatrixType >::setThreshold().

+ Here is the caller graph for this function:

◆ transpose()

ConstTransposeReturnType Eigen::SolverBase< FullPivLU< _MatrixType > >::transpose ( ) const
inlineinherited
Returns
an expression of the transposed of the factored matrix.

A typical usage is to solve for the transposed problem A^T x = b:

x = dec.transpose().solve(b);
See also
adjoint(), solve()
91 {
93 }
internal::add_const< Transpose< constDerived > >::type ConstTransposeReturnType
Definition SolverBase.h:82

Member Data Documentation

◆ m_colsTranspositions

template<typename _MatrixType >
IntRowVectorType Eigen::FullPivLU< _MatrixType >::m_colsTranspositions
protected

◆ m_det_pq

template<typename _MatrixType >
signed char Eigen::FullPivLU< _MatrixType >::m_det_pq
protected

◆ m_isInitialized

◆ m_l1_norm

template<typename _MatrixType >
RealScalar Eigen::FullPivLU< _MatrixType >::m_l1_norm
protected

◆ m_lu

◆ m_maxpivot

template<typename _MatrixType >
RealScalar Eigen::FullPivLU< _MatrixType >::m_maxpivot
protected

◆ m_nonzero_pivots

template<typename _MatrixType >
Index Eigen::FullPivLU< _MatrixType >::m_nonzero_pivots
protected

◆ m_p

template<typename _MatrixType >
PermutationPType Eigen::FullPivLU< _MatrixType >::m_p
protected

◆ m_prescribedThreshold

template<typename _MatrixType >
RealScalar Eigen::FullPivLU< _MatrixType >::m_prescribedThreshold
protected

◆ m_q

template<typename _MatrixType >
PermutationQType Eigen::FullPivLU< _MatrixType >::m_q
protected

◆ m_rowsTranspositions

template<typename _MatrixType >
IntColVectorType Eigen::FullPivLU< _MatrixType >::m_rowsTranspositions
protected

◆ m_usePrescribedThreshold

template<typename _MatrixType >
bool Eigen::FullPivLU< _MatrixType >::m_usePrescribedThreshold
protected

The documentation for this class was generated from the following files: