10#ifndef EIGEN_TRIANGULARMATRIXVECTOR_H
11#define EIGEN_TRIANGULARMATRIXVECTOR_H
17template<
typename Index,
int Mode,
typename LhsScalar,
bool ConjLhs,
typename RhsScalar,
bool ConjRhs,
int StorageOrder,
int Version=Specialized>
20template<
typename Index,
int Mode,
typename LhsScalar,
bool ConjLhs,
typename RhsScalar,
bool ConjRhs,
int Version>
33template<
typename Index,
int Mode,
typename LhsScalar,
bool ConjLhs,
typename RhsScalar,
bool ConjRhs,
int Version>
39 Index size = (std::min)(rows_,cols_);
40 Index rows = IsLower ? rows_ : (std::min)(rows_,cols_);
41 Index cols = IsLower ? (std::min)(rows_,cols_) : cols_;
45 typename conj_expr_if<ConjLhs,LhsMap>::type
cjLhs(lhs);
49 typename conj_expr_if<ConjRhs,RhsMap>::type
cjRhs(rhs);
63 Index s = IsLower ? ((HasUnitDiag||HasZeroDiag) ? i+1 : i ) :
pi;
65 if ((!(HasUnitDiag||HasZeroDiag)) || (--r)>0)
66 res.segment(s,r) += (alpha *
cjRhs.coeff(i)) *
cjLhs.col(i).segment(s,r);
68 res.coeffRef(i) += alpha *
cjRhs.coeff(i);
74 general_matrix_vector_product<Index,LhsScalar,LhsMapper,ColMajor,ConjLhs,RhsScalar,RhsMapper,ConjRhs,BuiltIn>::run(
78 &res.coeffRef(s),
resIncr, alpha);
81 if((!IsLower) && cols>size)
83 general_matrix_vector_product<Index,LhsScalar,LhsMapper,ColMajor,ConjLhs,RhsScalar,RhsMapper,ConjRhs>::run(
85 LhsMapper(&lhs.coeffRef(0,size), lhsStride),
86 RhsMapper(&rhs.coeffRef(size), rhsIncr),
87 res_, resIncr, alpha);
91template<
typename Index,
int Mode,
typename LhsScalar,
bool ConjLhs,
typename RhsScalar,
bool ConjRhs,
int Version>
104template<
typename Index,
int Mode,
typename LhsScalar,
bool ConjLhs,
typename RhsScalar,
bool ConjRhs,
int Version>
116 typename conj_expr_if<ConjLhs,LhsMap>::type
cjLhs(lhs);
120 typename conj_expr_if<ConjRhs,RhsMap>::type
cjRhs(rhs);
134 Index s = IsLower ?
pi : ((HasUnitDiag||HasZeroDiag) ? i+1 : i);
136 if ((!(HasUnitDiag||HasZeroDiag)) || (--r)>0)
137 res.coeffRef(i) += alpha * (
cjLhs.row(i).segment(s,r).cwiseProduct(
cjRhs.segment(s,r).
transpose())).sum();
139 res.coeffRef(i) += alpha *
cjRhs.coeff(i);
145 general_matrix_vector_product<Index,LhsScalar,LhsMapper,RowMajor,ConjLhs,RhsScalar,RhsMapper,ConjRhs,BuiltIn>::run(
152 if(IsLower && rows>diagSize)
154 general_matrix_vector_product<Index,LhsScalar,LhsMapper,RowMajor,ConjLhs,RhsScalar,RhsMapper,ConjRhs>::run(
156 LhsMapper(&lhs.coeffRef(diagSize,0), lhsStride),
157 RhsMapper(&rhs.coeffRef(0), rhsIncr),
158 &res.coeffRef(diagSize), resIncr, alpha);
166template<
int Mode,
int StorageOrder>
173template<
int Mode,
typename Lhs,
typename Rhs>
176 template<
typename Dest>
static void run(
Dest&
dst,
const Lhs &lhs,
const Rhs &rhs,
const typename Dest::Scalar& alpha)
178 eigen_assert(
dst.rows()==lhs.rows() &&
dst.cols()==rhs.cols());
184template<
int Mode,
typename Lhs,
typename Rhs>
187 template<
typename Dest>
static void run(
Dest&
dst,
const Lhs &lhs,
const Rhs &rhs,
const typename Dest::Scalar& alpha)
189 eigen_assert(
dst.rows()==lhs.rows() &&
dst.cols()==rhs.cols());
194 ::run(rhs.transpose(),lhs.transpose(),
dstT, alpha);
206 template<
typename Lhs,
typename Rhs,
typename Dest>
207 static void run(
const Lhs &lhs,
const Rhs &rhs,
Dest& dest,
const typename Dest::Scalar& alpha)
209 typedef typename Lhs::Scalar LhsScalar;
210 typedef typename Rhs::Scalar RhsScalar;
211 typedef typename Dest::Scalar ResScalar;
212 typedef typename Dest::RealScalar RealScalar;
215 typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;
217 typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType;
224 LhsScalar
lhs_alpha = LhsBlasTraits::extractScalarFactor(lhs);
225 RhsScalar
rhs_alpha = RhsBlasTraits::extractScalarFactor(rhs);
243 ei_declare_aligned_stack_constructed_variable(ResScalar,
actualDestPtr,dest.size(),
248 #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
249 Index size = dest.size();
263 LhsScalar, LhsBlasTraits::NeedToConjugate,
264 RhsScalar, RhsBlasTraits::NeedToConjugate,
289 template<
typename Lhs,
typename Rhs,
typename Dest>
290 static void run(
const Lhs &lhs,
const Rhs &rhs,
Dest& dest,
const typename Dest::Scalar& alpha)
292 typedef typename Lhs::Scalar LhsScalar;
293 typedef typename Rhs::Scalar RhsScalar;
294 typedef typename Dest::Scalar ResScalar;
297 typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;
299 typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType;
300 typedef typename internal::remove_all<ActualRhsType>::type ActualRhsTypeCleaned;
302 typename add_const<ActualLhsType>::type
actualLhs = LhsBlasTraits::extract(lhs);
303 typename add_const<ActualRhsType>::type
actualRhs = RhsBlasTraits::extract(rhs);
305 LhsScalar
lhs_alpha = LhsBlasTraits::extractScalarFactor(lhs);
306 RhsScalar
rhs_alpha = RhsBlasTraits::extractScalarFactor(rhs);
310 DirectlyUseRhs = ActualRhsTypeCleaned::InnerStrideAtCompileTime==1
320 #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
329 LhsScalar, LhsBlasTraits::NeedToConjugate,
330 RhsScalar, RhsBlasTraits::NeedToConjugate,
335 dest.data(),dest.innerStride(),
EIGEN_DEVICE_FUNC Derived & setZero()
Sets all coefficients in this expression to zero.
Definition CwiseNullaryOp.h:546
EIGEN_DEVICE_FUNC TransposeReturnType transpose()
Definition Transpose.h:182
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:50
@ UnitDiag
Matrix has ones on the diagonal; to be used in combination with #Lower or #Upper.
Definition Constants.h:213
@ ZeroDiag
Matrix has zeros on the diagonal; to be used in combination with #Lower or #Upper.
Definition Constants.h:215
@ Lower
View matrix as a lower triangular matrix.
Definition Constants.h:209
@ Upper
View matrix as an upper triangular matrix.
Definition Constants.h:211
@ ColMajor
Storage order is column major (see TopicStorageOrders).
Definition Constants.h:319
@ RowMajor
Storage order is row major (see TopicStorageOrders).
Definition Constants.h:321
const unsigned int RowMajorBit
for a matrix, this means that the storage order is row-major.
Definition Constants.h:66
Namespace containing all symbols from the Eigen library.
Definition LDLT.h:16
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
Holds information about the various numeric (i.e.
Definition NumTraits.h:236
Determines whether the given binary operation of two numeric types is allowed and what the scalar ret...
Definition XprHelper.h:806
Definition BlasUtil.h:403
Definition GenericPacketMath.h:107
Definition ForwardDeclarations.h:17
Definition TriangularMatrixVector.h:18
Definition ProductEvaluators.h:758
Definition TriangularMatrixVector.h:167