11 #ifndef EIGEN_PARTIALLU_H
12 #define EIGEN_PARTIALLU_H
20 template <
typename MatrixType_,
typename PermutationIndex_>
29 template <
typename T,
typename Derived>
35 template <
typename T,
typename Derived>
76 template <
typename MatrixType_,
typename PermutationIndex_>
116 template <
typename InputType>
126 template <
typename InputType>
129 template <
typename InputType>
154 #ifdef EIGEN_PARSED_BY_DOXYGEN
172 template <
typename Rhs>
216 #ifndef EIGEN_PARSED_BY_DOXYGEN
217 template <
typename RhsType,
typename DstType>
230 m_lu.template triangularView<UnitLower>().solveInPlace(dst);
233 m_lu.template triangularView<Upper>().solveInPlace(dst);
236 template <
bool Conjugate,
typename RhsType,
typename DstType>
248 dst =
m_lu.template triangularView<Upper>().transpose().template conjugateIf<Conjugate>().solve(rhs);
250 m_lu.template triangularView<UnitLower>().transpose().template conjugateIf<Conjugate>().solveInPlace(dst);
273 template <
typename MatrixType,
typename PermutationIndex>
277 template <
typename MatrixType,
typename PermutationIndex>
278 template <
typename InputType>
285 m_isInitialized(false) {
289 template <
typename MatrixType,
typename PermutationIndex>
290 template <
typename InputType>
297 m_isInitialized(false) {
304 template <
typename Scalar,
int StorageOrder,
typename PivIndex,
int SizeAtCompileTime = Dynamic>
329 typedef typename Scoring::result_type Score;
336 nb_transpositions = 0;
337 Index first_zero_pivot = -1;
339 int rrows = internal::convert_index<int>(
rows -
k - 1);
340 int rcols = internal::convert_index<int>(
cols -
k - 1);
342 Index row_of_biggest_in_col;
343 Score biggest_in_corner =
lu.col(
k).tail(
rows -
k).unaryExpr(Scoring()).maxCoeff(&row_of_biggest_in_col);
344 row_of_biggest_in_col +=
k;
346 row_transpositions[
k] = PivIndex(row_of_biggest_in_col);
349 if (
k != row_of_biggest_in_col) {
350 lu.row(
k).swap(
lu.row(row_of_biggest_in_col));
354 lu.col(
k).tail(fix<RRows>(rrows)) /=
lu.coeff(
k,
k);
355 }
else if (first_zero_pivot == -1) {
358 first_zero_pivot =
k;
362 lu.bottomRightCorner(fix<RRows>(rrows), fix<RCols>(rcols)).noalias() -=
363 lu.col(
k).tail(fix<RRows>(rrows)) *
lu.row(
k).tail(fix<RCols>(rcols));
369 row_transpositions[
k] = PivIndex(
k);
373 return first_zero_pivot;
392 PivIndex& nb_transpositions,
Index maxBlockSize = 256) {
406 blockSize =
size / 8;
407 blockSize = (blockSize / 16) * 16;
411 nb_transpositions = 0;
412 Index first_zero_pivot = -1;
429 PivIndex nb_transpositions_in_panel;
433 nb_transpositions_in_panel, 16);
434 if (
ret >= 0 && first_zero_pivot == -1) first_zero_pivot =
k +
ret;
436 nb_transpositions += nb_transpositions_in_panel;
439 Index piv = (row_transpositions[
i] += internal::convert_index<PivIndex>(
k));
440 A_0.row(
i).swap(A_0.row(piv));
445 for (
Index i =
k;
i <
k + bs; ++
i) A_2.row(
i).swap(A_2.row(row_transpositions[
i]));
448 A11.template triangularView<UnitLower>().solveInPlace(A12);
450 A22.noalias() -= A21 * A12;
453 return first_zero_pivot;
459 template <
typename MatrixType,
typename TranspositionType>
461 typename TranspositionType::StorageIndex& nb_transpositions) {
463 if (
lu.rows() == 0 ||
lu.cols() == 0) {
464 nb_transpositions = 0;
469 (&row_transpositions.coeffRef(1) - &row_transpositions.coeffRef(0)) == 1);
472 typename TranspositionType::StorageIndex,
474 blocked_lu(
lu.rows(),
lu.cols(), &
lu.coeffRef(0, 0),
lu.outerStride(), &row_transpositions.coeffRef(0),
480 template <
typename MatrixType,
typename PermutationIndex>
485 m_l1_norm = m_lu.cwiseAbs().colwise().sum().maxCoeff();
489 eigen_assert(m_lu.rows() == m_lu.cols() &&
"PartialPivLU is only for square (and moreover invertible) matrices");
492 m_rowsTranspositions.resize(
size);
496 m_det_p = (nb_transpositions % 2) ? -1 : 1;
498 m_p = m_rowsTranspositions;
500 m_isInitialized =
true;
503 template <
typename MatrixType,
typename PermutationIndex>
506 eigen_assert(m_isInitialized &&
"PartialPivLU is not initialized.");
507 return Scalar(m_det_p) * m_lu.diagonal().prod();
513 template <
typename MatrixType,
typename PermutationIndex>
515 eigen_assert(m_isInitialized &&
"LU is not initialized.");
517 MatrixType res = m_lu.template triangularView<UnitLower>().toDenseMatrix() * m_lu.template triangularView<Upper>();
520 res = m_p.inverse() *
res;
530 template <
typename DstXprType,
typename MatrixType,
typename PermutationIndex>
533 internal::
assign_op<typename DstXprType::Scalar, typename PartialPivLU<MatrixType, PermutationIndex>::Scalar>,
552 template <
typename Derived>
553 template <
typename PermutationIndex>
567 template <
typename Derived>
568 template <
typename PermutationIndex>
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define EIGEN_GENERIC_PUBLIC_INTERFACE(Derived)
Definition: Macros.h:1149
#define EIGEN_NOEXCEPT
Definition: Macros.h:1267
#define EIGEN_CONSTEXPR
Definition: Macros.h:758
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:892
#define eigen_assert(x)
Definition: Macros.h:910
cout<< "Here is the matrix m:"<< endl<< m<< endl;Matrix< ptrdiff_t, 3, 1 > res
Definition: PartialRedux_count.cpp:3
#define EIGEN_STATIC_ASSERT_NON_INTEGER(TYPE)
Definition: StaticAssert.h:74
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
Scalar * b
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
Expression of the inverse of another expression.
Definition: Inverse.h:43
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: Inverse.h:55
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: Inverse.h:54
EIGEN_DEVICE_FUNC const XprTypeNestedCleaned & nestedExpression() const
Definition: Inverse.h:57
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:52
const PartialPivLU< PlainObject, PermutationIndex > lu() const
const PartialPivLU< PlainObject, PermutationIndex > partialPivLu() const
Convenience specialization of Stride to specify only an outer stride See class Map for some examples.
Definition: Stride.h:104
LU decomposition of a matrix with partial pivoting, and related features.
Definition: PartialPivLU.h:77
bool m_isInitialized
Definition: PartialPivLU.h:266
SolverBase< PartialPivLU > Base
Definition: PartialPivLU.h:80
MatrixType_ MatrixType
Definition: PartialPivLU.h:79
PartialPivLU(Index size)
Default Constructor with memory preallocation.
Definition: PartialPivLU.h:274
RealScalar m_l1_norm
Definition: PartialPivLU.h:264
EIGEN_DEVICE_FUNC void _solve_impl_transposed(const RhsType &rhs, DstType &dst) const
Definition: PartialPivLU.h:237
TranspositionType m_rowsTranspositions
Definition: PartialPivLU.h:263
PermutationType m_p
Definition: PartialPivLU.h:262
PartialPivLU & compute(const EigenBase< InputType > &matrix)
Definition: PartialPivLU.h:130
MatrixType::PlainObject PlainObject
Definition: PartialPivLU.h:91
MatrixType reconstructedMatrix() const
Definition: PartialPivLU.h:514
const PermutationType & permutationP() const
Definition: PartialPivLU.h:149
signed char m_det_p
Definition: PartialPivLU.h:265
MatrixType m_lu
Definition: PartialPivLU.h:261
void compute()
Definition: PartialPivLU.h:481
PermutationIndex_ PermutationIndex
Definition: PartialPivLU.h:88
RealScalar rcond() const
Definition: PartialPivLU.h:179
EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: PartialPivLU.h:213
EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: PartialPivLU.h:214
PartialPivLU(const EigenBase< InputType > &matrix)
Definition: PartialPivLU.h:279
PartialPivLU()
Default Constructor.
Definition: PartialPivLU.h:270
Transpositions< RowsAtCompileTime, MaxRowsAtCompileTime, PermutationIndex > TranspositionType
Definition: PartialPivLU.h:90
@ MaxRowsAtCompileTime
Definition: PartialPivLU.h:85
@ MaxColsAtCompileTime
Definition: PartialPivLU.h:86
const Inverse< PartialPivLU > inverse() const
Definition: PartialPivLU.h:191
PartialPivLU(EigenBase< InputType > &matrix)
Definition: PartialPivLU.h:291
EIGEN_DEVICE_FUNC void _solve_impl(const RhsType &rhs, DstType &dst) const
Definition: PartialPivLU.h:218
const MatrixType & matrixLU() const
Definition: PartialPivLU.h:142
Scalar determinant() const
Definition: PartialPivLU.h:504
PermutationMatrix< RowsAtCompileTime, MaxRowsAtCompileTime, PermutationIndex > PermutationType
Definition: PartialPivLU.h:89
InverseReturnType transpose() const
Definition: PermutationMatrix.h:177
NumTraits< Scalar >::Real RealScalar
Definition: PlainObjectBase.h:130
static ConstMapType Map(const Scalar *data)
Definition: PlainObjectBase.h:595
A matrix or vector expression mapping an existing expression.
Definition: Ref.h:264
Pseudo expression representing a solving operation.
Definition: Solve.h:62
A base class for matrix decomposition and solvers.
Definition: SolverBase.h:72
internal::traits< Derived >::Scalar Scalar
Definition: SolverBase.h:75
const Solve< PartialPivLU< MatrixType_, PermutationIndex_ >, Rhs > solve(const MatrixBase< Rhs > &b) const
Definition: SolverBase.h:106
IndicesType::Scalar StorageIndex
Definition: Transpositions.h:147
cout<< "Here is the matrix m:"<< endl<< m<< endl;Eigen::FullPivLU< Matrix5x3 > lu(m)
Eigen::Map< Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor >, 0, Eigen::OuterStride<> > matrix(T *data, int rows, int cols, int stride)
Definition: common.h:85
#define min(a, b)
Definition: datatypes.h:22
#define max(a, b)
Definition: datatypes.h:23
@ ColMajor
Definition: Constants.h:318
@ RowMajor
Definition: Constants.h:320
const unsigned int RowMajorBit
Definition: Constants.h:70
Eigen::DenseIndex ret
Definition: level1_cplx_impl.h:43
char char char int int * k
Definition: level2_impl.h:374
void partial_lu_inplace(MatrixType &lu, TranspositionType &row_transpositions, typename TranspositionType::StorageIndex &nb_transpositions)
Definition: PartialPivLU.h:460
constexpr int min_size_prefer_fixed(A a, B b)
Definition: Meta.h:683
Decomposition::RealScalar rcond_estimate_helper(typename Decomposition::RealScalar matrix_norm, const Decomposition &dec)
Reciprocal condition number estimator.
Definition: ConditionEstimator.h:157
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool is_exactly_zero(const X &x)
Definition: Meta.h:592
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
const int Dynamic
Definition: Constants.h:25
Extend namespace for flags.
Definition: fsi_chan_precond_driver.cc:56
Definition: Eigen_Colamd.h:49
internal::nested_eval< T, 1 >::type eval(const T &xpr)
Definition: sparse_permutations.cpp:47
Definition: EigenBase.h:33
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:43
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index size() const EIGEN_NOEXCEPT
Definition: EigenBase.h:64
Definition: Constants.h:534
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
Definition: Constants.h:525
Inverse< LuType > SrcXprType
Definition: PartialPivLU.h:536
PartialPivLU< MatrixType, PermutationIndex > LuType
Definition: PartialPivLU.h:535
static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op< typename DstXprType::Scalar, typename LuType::Scalar > &)
Definition: PartialPivLU.h:537
Definition: AssignEvaluator.h:773
Definition: AssignEvaluator.h:756
Template functor for scalar/packet assignment.
Definition: AssignmentFunctors.h:25
Derived type
Definition: PartialPivLU.h:37
Definition: PartialPivLU.h:30
Definition: PartialPivLU.h:305
static constexpr int RCols
Definition: PartialPivLU.h:311
Matrix< Scalar, ActualSizeAtCompileTime, ActualSizeAtCompileTime, StorageOrder > MatrixType
Definition: PartialPivLU.h:312
static Index blocked_lu(Index rows, Index cols, Scalar *lu_data, Index luStride, PivIndex *row_transpositions, PivIndex &nb_transpositions, Index maxBlockSize=256)
Definition: PartialPivLU.h:391
static constexpr int UnBlockedBound
Definition: PartialPivLU.h:306
Ref< Matrix< Scalar, Dynamic, Dynamic, StorageOrder > > BlockType
Definition: PartialPivLU.h:314
Ref< MatrixType > MatrixTypeRef
Definition: PartialPivLU.h:313
static constexpr int RRows
Definition: PartialPivLU.h:310
static constexpr bool UnBlockedAtCompileTime
Definition: PartialPivLU.h:307
static constexpr int ActualSizeAtCompileTime
Definition: PartialPivLU.h:308
static Index unblocked_lu(MatrixTypeRef &lu, PivIndex *row_transpositions, PivIndex &nb_transpositions)
Definition: PartialPivLU.h:327
MatrixType::RealScalar RealScalar
Definition: PartialPivLU.h:315
Template functor to compute the score of a scalar, to chose a pivot.
Definition: functors/UnaryFunctors.h:63
SolverStorage StorageKind
Definition: PartialPivLU.h:23
traits< MatrixType_ > BaseTraits
Definition: PartialPivLU.h:25
MatrixXpr XprKind
Definition: PartialPivLU.h:22
PermutationIndex_ StorageIndex
Definition: PartialPivLU.h:24
Definition: ForwardDeclarations.h:21