10#ifndef EIGEN_SOLVETRIANGULAR_H
11#define EIGEN_SOLVETRIANGULAR_H
19template<
typename LhsScalar,
typename RhsScalar,
typename Index,
int S
ide,
int Mode,
bool Conjugate,
int StorageOrder>
22template <
typename Scalar,
typename Index,
int S
ide,
int Mode,
bool Conjugate,
int TriStorageOrder,
int OtherStorageOrder>
26template<
typename Lhs,
typename Rhs,
int S
ide>
31 RhsIsVectorAtCompileTime = (Side==
OnTheLeft ? Rhs::ColsAtCompileTime : Rhs::RowsAtCompileTime)==1
35 Unrolling = (RhsIsVectorAtCompileTime && Rhs::SizeAtCompileTime != Dynamic && Rhs::SizeAtCompileTime <= 8)
36 ? CompleteUnrolling : NoUnrolling,
37 RhsVectors = RhsIsVectorAtCompileTime ? 1 : Dynamic
41template<
typename Lhs,
typename Rhs,
49template<
typename Lhs,
typename Rhs,
int S
ide,
int Mode>
52 typedef typename Lhs::Scalar LhsScalar;
53 typedef typename Rhs::Scalar RhsScalar;
55 typedef typename LhsProductTraits::ExtractType ActualLhsType;
57 static void run(
const Lhs& lhs, Rhs& rhs)
59 ActualLhsType
actualLhs = LhsProductTraits::extract(lhs);
63 bool useRhsDirectly = Rhs::InnerStrideAtCompileTime==1 || rhs.innerStride()==1;
65 ei_declare_aligned_stack_constructed_variable(RhsScalar,
actualRhs,rhs.size(),
81template<
typename Lhs,
typename Rhs,
int S
ide,
int Mode>
84 typedef typename Rhs::Scalar Scalar;
86 typedef typename LhsProductTraits::DirectLinearAccessType ActualLhsType;
88 static void run(
const Lhs& lhs, Rhs& rhs)
92 const Index size = lhs.rows();
96 Rhs::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime, Lhs::MaxRowsAtCompileTime,4>
BlockingType;
110template<
typename Lhs,
typename Rhs,
int Mode,
int LoopIndex,
int Size,
114template<
typename Lhs,
typename Rhs,
int Mode,
int LoopIndex,
int Size>
119 StartIndex = IsLower ? 0 : DiagIndex+1
121 static void run(
const Lhs& lhs, Rhs& rhs)
124 rhs.coeffRef(DiagIndex) -= lhs.row(DiagIndex).template
segment<LoopIndex>(StartIndex).transpose()
128 rhs.coeffRef(DiagIndex) /= lhs.coeff(DiagIndex,DiagIndex);
134template<
typename Lhs,
typename Rhs,
int Mode,
int LoopIndex,
int Size>
136 static void run(
const Lhs&, Rhs&) {}
139template<
typename Lhs,
typename Rhs,
int Mode>
141 static void run(
const Lhs& lhs, Rhs& rhs)
145template<
typename Lhs,
typename Rhs,
int Mode>
147 static void run(
const Lhs& lhs, Rhs& rhs)
164template<
typename MatrixType,
unsigned int Mode>
165template<
int S
ide,
typename OtherDerived>
169 eigen_assert( derived().cols() == derived().rows() && ((Side==
OnTheLeft && derived().cols() == other.rows()) || (Side==
OnTheRight && derived().cols() == other.cols())) );
173 typedef typename internal::conditional<copy,
174 typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&>::type OtherCopy;
175 OtherCopy otherCopy(other);
177 internal::triangular_solver_selector<MatrixType, typename internal::remove_reference<OtherCopy>::type,
178 Side, Mode>::run(derived().nestedExpression(), otherCopy);
184template<
typename Derived,
unsigned int Mode>
185template<
int S
ide,
typename Other>
186const internal::triangular_solve_retval<Side,TriangularView<Derived,Mode>,Other>
187TriangularViewImpl<Derived,Mode,Dense>::solve(
const MatrixBase<Other>& other)
const
189 return internal::triangular_solve_retval<Side,TriangularViewType,Other>(derived(), other.derived());
195template<
int S
ide,
typename TriangularType,
typename Rhs>
202 :
public ReturnByValue<triangular_solve_retval<Side, TriangularType, Rhs> >
208 : m_triangularMatrix(
tri), m_rhs(rhs)
211 inline Index rows()
const {
return m_rhs.rows(); }
212 inline Index cols()
const {
return m_rhs.cols(); }
214 template<
typename Dest>
inline void evalTo(
Dest&
dst)
const
223 typename Rhs::Nested m_rhs;
Definition ReturnByValue.h:53
Pseudo expression representing a solving operation.
Definition Solve.h:63
Definition TriangularMatrix.h:184
Definition GeneralMatrixMatrix.h:247
Definition SolveTriangular.h:28
@ UnitDiag
Matrix has ones on the diagonal; to be used in combination with #Lower or #Upper.
Definition Constants.h:208
@ ZeroDiag
Matrix has zeros on the diagonal; to be used in combination with #Lower or #Upper.
Definition Constants.h:210
@ Lower
View matrix as a lower triangular matrix.
Definition Constants.h:204
@ Upper
View matrix as an upper triangular matrix.
Definition Constants.h:206
@ Aligned
Definition Constants.h:235
@ ColMajor
Storage order is column major (see TopicStorageOrders).
Definition Constants.h:320
@ RowMajor
Storage order is row major (see TopicStorageOrders).
Definition Constants.h:322
@ OnTheLeft
Apply transformation on the left.
Definition Constants.h:333
@ OnTheRight
Apply transformation on the right.
Definition Constants.h:335
const unsigned int RowMajorBit
for a matrix, this means that the storage order is row-major.
Definition Constants.h:61
Definition ForwardDeclarations.h:17
Definition SolveTriangular.h:23
Definition SolveTriangular.h:203
Definition SolveTriangular.h:20
Definition SolveTriangular.h:47
Definition SolveTriangular.h:112