11 #ifndef EIGEN_TRIANGULARMATRIX_H
12 #define EIGEN_TRIANGULARMATRIX_H
18 template<
int S
ide,
typename TriangularType,
typename Rhs>
struct triangular_solve_retval;
29 template<
typename Derived>
class TriangularBase :
public EigenBase<Derived>
34 Mode = internal::traits<Derived>::Mode,
35 CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
36 RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
37 ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
38 MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
39 MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime
41 typedef typename internal::traits<Derived>::Scalar Scalar;
42 typedef typename internal::traits<Derived>::StorageKind StorageKind;
43 typedef typename internal::traits<Derived>::Index Index;
44 typedef typename internal::traits<Derived>::DenseMatrixType DenseMatrixType;
45 typedef DenseMatrixType DenseType;
47 inline TriangularBase() { eigen_assert(!((Mode&
UnitDiag) && (Mode&
ZeroDiag))); }
49 inline Index rows()
const {
return derived().rows(); }
50 inline Index cols()
const {
return derived().cols(); }
51 inline Index outerStride()
const {
return derived().outerStride(); }
52 inline Index innerStride()
const {
return derived().innerStride(); }
54 inline Scalar coeff(Index row, Index col)
const {
return derived().coeff(row,col); }
55 inline Scalar& coeffRef(Index row, Index col) {
return derived().coeffRef(row,col); }
59 template<
typename Other>
60 EIGEN_STRONG_INLINE
void copyCoeff(Index row, Index col, Other& other)
62 derived().coeffRef(row, col) = other.coeff(row, col);
65 inline Scalar operator()(Index row, Index col)
const
67 check_coordinates(row, col);
68 return coeff(row,col);
70 inline Scalar& operator()(Index row, Index col)
72 check_coordinates(row, col);
73 return coeffRef(row,col);
76 #ifndef EIGEN_PARSED_BY_DOXYGEN
77 inline const Derived&
derived()
const {
return *
static_cast<const Derived*
>(
this); }
78 inline Derived&
derived() {
return *
static_cast<Derived*
>(
this); }
79 #endif // not EIGEN_PARSED_BY_DOXYGEN
81 template<
typename DenseDerived>
82 void evalTo(MatrixBase<DenseDerived> &other)
const;
83 template<
typename DenseDerived>
84 void evalToLazy(MatrixBase<DenseDerived> &other)
const;
86 DenseMatrixType toDenseMatrix()
const
88 DenseMatrixType res(rows(), cols());
95 void check_coordinates(Index row, Index col)
const
97 EIGEN_ONLY_USED_FOR_DEBUG(row);
98 EIGEN_ONLY_USED_FOR_DEBUG(col);
99 eigen_assert(col>=0 && col<cols() && row>=0 && row<rows());
101 EIGEN_ONLY_USED_FOR_DEBUG(mode);
102 eigen_assert((mode==
Upper && col>=row)
103 || (mode==
Lower && col<=row)
108 #ifdef EIGEN_INTERNAL_DEBUGGING
109 void check_coordinates_internal(Index row, Index col)
const
111 check_coordinates(row, col);
114 void check_coordinates_internal(Index , Index )
const {}
137 template<
typename MatrixType,
unsigned int _Mode>
138 struct traits<TriangularView<MatrixType, _Mode> > : traits<MatrixType>
140 typedef typename nested<MatrixType>::type MatrixTypeNested;
141 typedef typename remove_reference<MatrixTypeNested>::type MatrixTypeNestedNonRef;
142 typedef typename remove_all<MatrixTypeNested>::type MatrixTypeNestedCleaned;
143 typedef MatrixType ExpressionType;
144 typedef typename MatrixType::PlainObject DenseMatrixType;
148 CoeffReadCost = MatrixTypeNestedCleaned::CoeffReadCost
153 template<
int Mode,
bool LhsIsTriangular,
154 typename Lhs,
bool LhsIsVector,
155 typename Rhs,
bool RhsIsVector>
156 struct TriangularProduct;
159 :
public TriangularBase<TriangularView<_MatrixType, _Mode> >
163 typedef TriangularBase<TriangularView> Base;
164 typedef typename internal::traits<TriangularView>::Scalar Scalar;
166 typedef _MatrixType MatrixType;
167 typedef typename internal::traits<TriangularView>::DenseMatrixType DenseMatrixType;
168 typedef DenseMatrixType PlainObject;
171 typedef typename internal::traits<TriangularView>::MatrixTypeNested MatrixTypeNested;
172 typedef typename internal::traits<TriangularView>::MatrixTypeNestedNonRef MatrixTypeNestedNonRef;
173 typedef typename internal::traits<TriangularView>::MatrixTypeNestedCleaned MatrixTypeNestedCleaned;
175 typedef typename internal::remove_all<typename MatrixType::ConjugateReturnType>::type MatrixConjugateReturnType;
178 using Base::evalToLazy;
181 typedef typename internal::traits<TriangularView>::StorageKind StorageKind;
182 typedef typename internal::traits<TriangularView>::Index Index;
192 inline TriangularView(
const MatrixType& matrix) : m_matrix(matrix)
195 inline Index rows()
const {
return m_matrix.rows(); }
196 inline Index cols()
const {
return m_matrix.cols(); }
197 inline Index outerStride()
const {
return m_matrix.outerStride(); }
198 inline Index innerStride()
const {
return m_matrix.innerStride(); }
213 {
return *
this = MatrixType::Constant(rows(), cols(), value); }
222 inline Scalar
coeff(Index row, Index col)
const
224 Base::check_coordinates_internal(row, col);
225 return m_matrix.coeff(row, col);
233 Base::check_coordinates_internal(row, col);
234 return m_matrix.const_cast_derived().coeffRef(row, col);
237 const MatrixTypeNestedCleaned& nestedExpression()
const {
return m_matrix; }
238 MatrixTypeNestedCleaned& nestedExpression() {
return *
const_cast<MatrixTypeNestedCleaned*
>(&m_matrix); }
241 template<
typename OtherDerived>
242 TriangularView&
operator=(
const TriangularBase<OtherDerived>& other);
244 template<
typename OtherDerived>
245 TriangularView&
operator=(
const MatrixBase<OtherDerived>& other);
247 TriangularView&
operator=(
const TriangularView& other)
248 {
return *
this = other.nestedExpression(); }
250 template<
typename OtherDerived>
251 void lazyAssign(
const TriangularBase<OtherDerived>& other);
253 template<
typename OtherDerived>
254 void lazyAssign(
const MatrixBase<OtherDerived>& other);
258 {
return m_matrix.conjugate(); }
261 {
return m_matrix.conjugate(); }
265 {
return m_matrix.adjoint(); }
270 EIGEN_STATIC_ASSERT_LVALUE(MatrixType)
271 return m_matrix.const_cast_derived().transpose();
276 return m_matrix.transpose();
280 template<
typename OtherDerived>
281 TriangularProduct<Mode, true, MatrixType, false, OtherDerived, OtherDerived::ColsAtCompileTime==1>
284 return TriangularProduct
285 <Mode,
true, MatrixType,
false, OtherDerived, OtherDerived::ColsAtCompileTime==1>
286 (m_matrix, rhs.derived());
290 template<
typename OtherDerived>
friend
291 TriangularProduct<Mode, false, OtherDerived, OtherDerived::RowsAtCompileTime==1, MatrixType, false>
294 return TriangularProduct
295 <Mode,
false, OtherDerived, OtherDerived::RowsAtCompileTime==1, MatrixType,
false>
296 (lhs.derived(),rhs.m_matrix);
299 #ifdef EIGEN2_SUPPORT
300 template<
typename OtherDerived>
301 struct eigen2_product_return_type
303 typedef typename TriangularView<MatrixType,Mode>::DenseMatrixType DenseMatrixType;
304 typedef typename OtherDerived::PlainObject::DenseType OtherPlainObject;
306 typedef typename ProdRetType::PlainObject type;
308 template<
typename OtherDerived>
309 const typename eigen2_product_return_type<OtherDerived>::type
310 operator*(
const EigenBase<OtherDerived>& rhs)
const
312 typename OtherDerived::PlainObject::DenseType rhsPlainObject;
313 rhs.evalTo(rhsPlainObject);
314 return this->toDenseMatrix() * rhsPlainObject;
316 template<
typename OtherMatrixType>
317 bool isApprox(
const TriangularView<OtherMatrixType, Mode>& other,
typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())
const
319 return this->toDenseMatrix().isApprox(other.toDenseMatrix(), precision);
321 template<
typename OtherDerived>
322 bool isApprox(
const MatrixBase<OtherDerived>& other,
typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())
const
324 return this->toDenseMatrix().isApprox(other, precision);
326 #endif // EIGEN2_SUPPORT
328 template<
int S
ide,
typename Other>
329 inline const internal::triangular_solve_retval<Side,TriangularView, Other>
330 solve(
const MatrixBase<Other>& other)
const;
332 template<
int S
ide,
typename OtherDerived>
333 void solveInPlace(
const MatrixBase<OtherDerived>& other)
const;
335 template<
typename Other>
336 inline const internal::triangular_solve_retval<OnTheLeft,TriangularView, Other>
337 solve(
const MatrixBase<Other>& other)
const
338 {
return solve<OnTheLeft>(other); }
340 template<
typename OtherDerived>
341 void solveInPlace(
const MatrixBase<OtherDerived>& other)
const
342 {
return solveInPlace<OnTheLeft>(other); }
344 const SelfAdjointView<MatrixTypeNestedNonRef,Mode> selfadjointView()
const
346 EIGEN_STATIC_ASSERT((Mode&
UnitDiag)==0,PROGRAMMING_ERROR);
347 return SelfAdjointView<MatrixTypeNestedNonRef,Mode>(m_matrix);
349 SelfAdjointView<MatrixTypeNestedNonRef,Mode> selfadjointView()
351 EIGEN_STATIC_ASSERT((Mode&
UnitDiag)==0,PROGRAMMING_ERROR);
352 return SelfAdjointView<MatrixTypeNestedNonRef,Mode>(m_matrix);
355 template<
typename OtherDerived>
356 void swap(TriangularBase<OtherDerived>
const & other)
358 TriangularView<SwapWrapper<MatrixType>,Mode>(
const_cast<MatrixType&
>(m_matrix)).lazyAssign(other.derived());
361 template<
typename OtherDerived>
362 void swap(MatrixBase<OtherDerived>
const & other)
364 SwapWrapper<MatrixType> swaper(const_cast<MatrixType&>(m_matrix));
365 TriangularView<SwapWrapper<MatrixType>,Mode>(swaper).lazyAssign(other.derived());
368 Scalar determinant()
const
375 return m_matrix.diagonal().prod();
379 template<
typename ProductDerived,
typename Lhs,
typename Rhs>
380 EIGEN_STRONG_INLINE TriangularView&
operator=(
const ProductBase<ProductDerived, Lhs,Rhs>& other)
383 return assignProduct(other.derived(),1);
386 template<
typename ProductDerived,
typename Lhs,
typename Rhs>
387 EIGEN_STRONG_INLINE TriangularView&
operator+=(
const ProductBase<ProductDerived, Lhs,Rhs>& other)
389 return assignProduct(other.derived(),1);
392 template<
typename ProductDerived,
typename Lhs,
typename Rhs>
393 EIGEN_STRONG_INLINE TriangularView&
operator-=(
const ProductBase<ProductDerived, Lhs,Rhs>& other)
395 return assignProduct(other.derived(),-1);
399 template<
typename ProductDerived>
400 EIGEN_STRONG_INLINE TriangularView&
operator=(
const ScaledProduct<ProductDerived>& other)
403 return assignProduct(other.derived(),other.alpha());
406 template<
typename ProductDerived>
407 EIGEN_STRONG_INLINE TriangularView&
operator+=(
const ScaledProduct<ProductDerived>& other)
409 return assignProduct(other.derived(),other.alpha());
412 template<
typename ProductDerived>
413 EIGEN_STRONG_INLINE TriangularView&
operator-=(
const ScaledProduct<ProductDerived>& other)
415 return assignProduct(other.derived(),-other.alpha());
420 template<
typename ProductDerived,
typename Lhs,
typename Rhs>
421 EIGEN_STRONG_INLINE TriangularView& assignProduct(
const ProductBase<ProductDerived, Lhs,Rhs>& prod,
const Scalar& alpha);
423 template<
int Mode,
bool LhsIsTriangular,
424 typename Lhs,
bool LhsIsVector,
425 typename Rhs,
bool RhsIsVector>
426 EIGEN_STRONG_INLINE TriangularView& assignProduct(
const TriangularProduct<Mode, LhsIsTriangular, Lhs, LhsIsVector, Rhs, RhsIsVector>& prod,
const Scalar& alpha)
428 lazyAssign(alpha*prod.eval());
432 MatrixTypeNested m_matrix;
441 template<
typename Derived1,
typename Derived2,
unsigned int Mode,
int UnrollCount,
bool ClearOpposite>
442 struct triangular_assignment_selector
445 col = (UnrollCount-1) / Derived1::RowsAtCompileTime,
446 row = (UnrollCount-1) % Derived1::RowsAtCompileTime
449 typedef typename Derived1::Scalar Scalar;
451 static inline void run(Derived1 &dst,
const Derived2 &src)
453 triangular_assignment_selector<Derived1, Derived2, Mode, UnrollCount-1, ClearOpposite>::run(dst, src);
458 if((Mode ==
Upper && row <= col)
459 || (Mode ==
Lower && row >= col)
464 dst.copyCoeff(row, col, src);
465 else if(ClearOpposite)
467 if (Mode&UnitDiag && row==col)
468 dst.coeffRef(row, col) = Scalar(1);
470 dst.coeffRef(row, col) = Scalar(0);
476 template<
typename Derived1,
typename Derived2,
unsigned int Mode,
bool ClearOpposite>
477 struct triangular_assignment_selector<Derived1, Derived2, Mode, 0, ClearOpposite>
479 static inline void run(Derived1 &,
const Derived2 &) {}
482 template<
typename Derived1,
typename Derived2,
bool ClearOpposite>
483 struct triangular_assignment_selector<Derived1, Derived2,
Upper,
Dynamic, ClearOpposite>
485 typedef typename Derived1::Index Index;
486 typedef typename Derived1::Scalar Scalar;
487 static inline void run(Derived1 &dst,
const Derived2 &src)
489 for(Index j = 0; j < dst.cols(); ++j)
491 Index maxi = (std::min)(j, dst.rows()-1);
492 for(Index i = 0; i <= maxi; ++i)
493 dst.copyCoeff(i, j, src);
495 for(Index i = maxi+1; i < dst.rows(); ++i)
496 dst.coeffRef(i, j) = Scalar(0);
501 template<
typename Derived1,
typename Derived2,
bool ClearOpposite>
502 struct triangular_assignment_selector<Derived1, Derived2,
Lower,
Dynamic, ClearOpposite>
504 typedef typename Derived1::Index Index;
505 static inline void run(Derived1 &dst,
const Derived2 &src)
507 for(Index j = 0; j < dst.cols(); ++j)
509 for(Index i = j; i < dst.rows(); ++i)
510 dst.copyCoeff(i, j, src);
511 Index maxi = (std::min)(j, dst.rows());
513 for(Index i = 0; i < maxi; ++i)
514 dst.coeffRef(i, j) =
static_cast<typename Derived1::Scalar
>(0);
519 template<
typename Derived1,
typename Derived2,
bool ClearOpposite>
520 struct triangular_assignment_selector<Derived1, Derived2,
StrictlyUpper,
Dynamic, ClearOpposite>
522 typedef typename Derived1::Index Index;
523 typedef typename Derived1::Scalar Scalar;
524 static inline void run(Derived1 &dst,
const Derived2 &src)
526 for(Index j = 0; j < dst.cols(); ++j)
528 Index maxi = (std::min)(j, dst.rows());
529 for(Index i = 0; i < maxi; ++i)
530 dst.copyCoeff(i, j, src);
532 for(Index i = maxi; i < dst.rows(); ++i)
533 dst.coeffRef(i, j) = Scalar(0);
538 template<
typename Derived1,
typename Derived2,
bool ClearOpposite>
539 struct triangular_assignment_selector<Derived1, Derived2,
StrictlyLower,
Dynamic, ClearOpposite>
541 typedef typename Derived1::Index Index;
542 static inline void run(Derived1 &dst,
const Derived2 &src)
544 for(Index j = 0; j < dst.cols(); ++j)
546 for(Index i = j+1; i < dst.rows(); ++i)
547 dst.copyCoeff(i, j, src);
548 Index maxi = (std::min)(j, dst.rows()-1);
550 for(Index i = 0; i <= maxi; ++i)
551 dst.coeffRef(i, j) =
static_cast<typename Derived1::Scalar
>(0);
556 template<
typename Derived1,
typename Derived2,
bool ClearOpposite>
557 struct triangular_assignment_selector<Derived1, Derived2,
UnitUpper,
Dynamic, ClearOpposite>
559 typedef typename Derived1::Index Index;
560 static inline void run(Derived1 &dst,
const Derived2 &src)
562 for(Index j = 0; j < dst.cols(); ++j)
564 Index maxi = (std::min)(j, dst.rows());
565 for(Index i = 0; i < maxi; ++i)
566 dst.copyCoeff(i, j, src);
569 for(Index i = maxi+1; i < dst.rows(); ++i)
570 dst.coeffRef(i, j) = 0;
573 dst.diagonal().setOnes();
576 template<
typename Derived1,
typename Derived2,
bool ClearOpposite>
577 struct triangular_assignment_selector<Derived1, Derived2,
UnitLower,
Dynamic, ClearOpposite>
579 typedef typename Derived1::Index Index;
580 static inline void run(Derived1 &dst,
const Derived2 &src)
582 for(Index j = 0; j < dst.cols(); ++j)
584 Index maxi = (std::min)(j, dst.rows());
585 for(Index i = maxi+1; i < dst.rows(); ++i)
586 dst.copyCoeff(i, j, src);
589 for(Index i = 0; i < maxi; ++i)
590 dst.coeffRef(i, j) = 0;
593 dst.diagonal().setOnes();
600 template<
typename MatrixType,
unsigned int Mode>
601 template<
typename OtherDerived>
602 inline TriangularView<MatrixType, Mode>&
607 typename internal::plain_matrix_type<OtherDerived>::type other_evaluated(other.rows(), other.cols());
608 other_evaluated.template triangularView<Mode>().lazyAssign(other.derived());
609 lazyAssign(other_evaluated);
612 lazyAssign(other.derived());
617 template<
typename MatrixType,
unsigned int Mode>
618 template<
typename OtherDerived>
619 void TriangularView<MatrixType, Mode>::lazyAssign(
const MatrixBase<OtherDerived>& other)
622 unroll = MatrixType::SizeAtCompileTime !=
Dynamic
623 && internal::traits<OtherDerived>::CoeffReadCost !=
Dynamic
624 && MatrixType::SizeAtCompileTime*internal::traits<OtherDerived>::CoeffReadCost/2 <= EIGEN_UNROLLING_LIMIT
626 eigen_assert(m_matrix.rows() == other.rows() && m_matrix.cols() == other.cols());
628 internal::triangular_assignment_selector
629 <MatrixType, OtherDerived, int(Mode),
630 unroll ? int(MatrixType::SizeAtCompileTime) :
Dynamic,
632 >::run(m_matrix.const_cast_derived(), other.derived());
637 template<
typename MatrixType,
unsigned int Mode>
638 template<
typename OtherDerived>
639 inline TriangularView<MatrixType, Mode>&
642 eigen_assert(Mode ==
int(OtherDerived::Mode));
643 if(internal::traits<OtherDerived>::Flags & EvalBeforeAssigningBit)
645 typename OtherDerived::DenseMatrixType other_evaluated(other.rows(), other.cols());
646 other_evaluated.template triangularView<Mode>().lazyAssign(other.derived().nestedExpression());
647 lazyAssign(other_evaluated);
650 lazyAssign(other.derived().nestedExpression());
654 template<
typename MatrixType,
unsigned int Mode>
655 template<
typename OtherDerived>
656 void TriangularView<MatrixType, Mode>::lazyAssign(
const TriangularBase<OtherDerived>& other)
659 unroll = MatrixType::SizeAtCompileTime !=
Dynamic
660 && internal::traits<OtherDerived>::CoeffReadCost !=
Dynamic
661 && MatrixType::SizeAtCompileTime * internal::traits<OtherDerived>::CoeffReadCost / 2
662 <= EIGEN_UNROLLING_LIMIT
664 eigen_assert(m_matrix.rows() == other.rows() && m_matrix.cols() == other.cols());
666 internal::triangular_assignment_selector
667 <MatrixType, OtherDerived, int(Mode),
668 unroll ? int(MatrixType::SizeAtCompileTime) :
Dynamic,
670 >::run(m_matrix.const_cast_derived(), other.derived().nestedExpression());
679 template<
typename Derived>
680 template<
typename DenseDerived>
681 void TriangularBase<Derived>::evalTo(MatrixBase<DenseDerived> &other)
const
683 if(internal::traits<Derived>::Flags & EvalBeforeAssigningBit)
685 typename internal::plain_matrix_type<Derived>::type other_evaluated(rows(), cols());
686 evalToLazy(other_evaluated);
687 other.derived().swap(other_evaluated);
690 evalToLazy(other.derived());
695 template<
typename Derived>
696 template<
typename DenseDerived>
697 void TriangularBase<Derived>::evalToLazy(MatrixBase<DenseDerived> &other)
const
700 unroll = DenseDerived::SizeAtCompileTime !=
Dynamic
701 && internal::traits<Derived>::CoeffReadCost !=
Dynamic
702 && DenseDerived::SizeAtCompileTime * internal::traits<Derived>::CoeffReadCost / 2
703 <= EIGEN_UNROLLING_LIMIT
705 other.derived().resize(this->rows(), this->cols());
707 internal::triangular_assignment_selector
708 <DenseDerived,
typename internal::traits<Derived>::MatrixTypeNestedCleaned, Derived::Mode,
709 unroll ? int(DenseDerived::SizeAtCompileTime) :
Dynamic,
711 >::run(other.derived(), derived().nestedExpression());
722 #ifdef EIGEN2_SUPPORT
727 template<
typename MatrixType,
unsigned int Mode>
728 struct eigen2_part_return_type
730 typedef TriangularView<MatrixType, Mode> type;
733 template<
typename MatrixType>
734 struct eigen2_part_return_type<MatrixType,
SelfAdjoint>
736 typedef SelfAdjointView<MatrixType, Upper> type;
741 template<
typename Derived>
742 template<
unsigned int Mode>
743 const typename internal::eigen2_part_return_type<Derived, Mode>::type MatrixBase<Derived>::part()
const
749 template<
typename Derived>
750 template<
unsigned int Mode>
751 typename internal::eigen2_part_return_type<Derived, Mode>::type MatrixBase<Derived>::part()
768 template<
typename Derived>
769 template<
unsigned int Mode>
770 typename MatrixBase<Derived>::template TriangularViewReturnType<Mode>::Type
777 template<
typename Derived>
778 template<
unsigned int Mode>
790 template<
typename Derived>
794 RealScalar maxAbsOnUpperPart =
static_cast<RealScalar
>(-1);
795 for(
Index j = 0; j < cols(); ++j)
797 Index maxi = (std::min)(j, rows()-1);
798 for(
Index i = 0; i <= maxi; ++i)
800 RealScalar absValue = abs(coeff(i,j));
801 if(absValue > maxAbsOnUpperPart) maxAbsOnUpperPart = absValue;
804 RealScalar threshold = maxAbsOnUpperPart * prec;
805 for(
Index j = 0; j < cols(); ++j)
806 for(
Index i = j+1; i < rows(); ++i)
807 if(abs(coeff(i, j)) > threshold)
return false;
816 template<
typename Derived>
820 RealScalar maxAbsOnLowerPart =
static_cast<RealScalar
>(-1);
821 for(
Index j = 0; j < cols(); ++j)
822 for(
Index i = j; i < rows(); ++i)
824 RealScalar absValue = abs(coeff(i,j));
825 if(absValue > maxAbsOnLowerPart) maxAbsOnLowerPart = absValue;
827 RealScalar threshold = maxAbsOnLowerPart * prec;
828 for(
Index j = 1; j < cols(); ++j)
830 Index maxi = (std::min)(j, rows()-1);
831 for(
Index i = 0; i < maxi; ++i)
832 if(abs(coeff(i, j)) > threshold)
return false;
839 #endif // EIGEN_TRIANGULARMATRIX_H
Expression of the product of two general matrices or vectors.
Definition: GeneralProduct.h:36
Definition: Constants.h:175
Definition: Constants.h:167
TriangularView & operator*=(const typename internal::traits< MatrixType >::Scalar &other)
Definition: TriangularMatrix.h:205
TriangularView & operator-=(const DenseBase< Other > &other)
Definition: TriangularMatrix.h:203
bool isUpperTriangular(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: TriangularMatrix.h:791
void solveInPlace(const MatrixBase< OtherDerived > &other) const
Definition: SolveTriangular.h:174
Definition: Constants.h:181
const TriangularView< MatrixConjugateReturnType, Mode > conjugate() const
Definition: TriangularMatrix.h:260
TriangularView & setConstant(const Scalar &value)
Definition: TriangularMatrix.h:212
const int Dynamic
Definition: Constants.h:21
void fill(const Scalar &value)
Definition: TriangularMatrix.h:210
const unsigned int PacketAccessBit
Definition: Constants.h:81
Base class for all dense matrices, vectors, and arrays.
Definition: DenseBase.h:41
Definition: Constants.h:173
Definition: Constants.h:169
Scalar coeff(Index row, Index col) const
Definition: TriangularMatrix.h:222
bool isLowerTriangular(const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: TriangularMatrix.h:817
TriangularProduct< Mode, true, MatrixType, false, OtherDerived, OtherDerived::ColsAtCompileTime==1 > operator*(const MatrixBase< OtherDerived > &rhs) const
Definition: TriangularMatrix.h:282
TriangularView< Transpose< MatrixType >, TransposeMode > transpose()
Definition: TriangularMatrix.h:268
friend TriangularProduct< Mode, false, OtherDerived, OtherDerived::RowsAtCompileTime==1, MatrixType, false > operator*(const MatrixBase< OtherDerived > &lhs, const TriangularView &rhs)
Definition: TriangularMatrix.h:292
const TriangularView< const typename MatrixType::AdjointReturnType, TransposeMode > adjoint() const
Definition: TriangularMatrix.h:264
Derived & derived()
Definition: EigenBase.h:34
TriangularView & setOnes()
Definition: TriangularMatrix.h:217
const unsigned int LinearAccessBit
Definition: Constants.h:117
Scalar & coeffRef(Index row, Index col)
Definition: TriangularMatrix.h:231
TriangularView & operator/=(const typename internal::traits< MatrixType >::Scalar &other)
Definition: TriangularMatrix.h:207
Definition: Constants.h:171
internal::traits< Derived >::Index Index
The type of indices.
Definition: DenseBase.h:60
Definition: Constants.h:179
const unsigned int EvalBeforeAssigningBit
Definition: Constants.h:63
const TriangularView< Transpose< MatrixType >, TransposeMode > transpose() const
Definition: TriangularMatrix.h:274
Definition: Constants.h:183
TriangularView & operator=(const TriangularBase< OtherDerived > &other)
Base class for triangular part in a matrix.
Definition: TriangularMatrix.h:158
const unsigned int DirectAccessBit
Definition: Constants.h:142
TriangularView & operator+=(const DenseBase< Other > &other)
Definition: TriangularMatrix.h:201
TriangularView & setZero()
Definition: TriangularMatrix.h:215
Definition: Constants.h:177
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:48
TriangularView< MatrixConjugateReturnType, Mode > conjugate()
Definition: TriangularMatrix.h:257