10 #ifndef EIGEN_TRIANGULAR_SOLVER_VECTOR_H
11 #define EIGEN_TRIANGULAR_SOLVER_VECTOR_H
17 template<
typename LhsScalar,
typename RhsScalar,
typename Index,
int Mode,
bool Conjugate,
int StorageOrder>
18 struct triangular_solve_vector<LhsScalar, RhsScalar, Index,
OnTheRight, Mode, Conjugate, StorageOrder>
20 static void run(Index size,
const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs)
22 triangular_solve_vector<LhsScalar,RhsScalar,Index,
OnTheLeft,
25 >::run(size, _lhs, lhsStride, rhs);
30 template<
typename LhsScalar,
typename RhsScalar,
typename Index,
int Mode,
bool Conjugate>
31 struct triangular_solve_vector<LhsScalar, RhsScalar, Index,
OnTheLeft, Mode, Conjugate,
RowMajor>
36 static void run(Index size,
const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs)
38 typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,RowMajor>, 0, OuterStride<> > LhsMap;
39 const LhsMap lhs(_lhs,size,size,OuterStride<>(lhsStride));
41 typedef const_blas_data_mapper<LhsScalar,Index,RowMajor> LhsMapper;
42 typedef const_blas_data_mapper<RhsScalar,Index,ColMajor> RhsMapper;
44 typename internal::conditional<
46 const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>,LhsMap>,
49 static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;
50 for(Index pi=IsLower ? 0 : size;
51 IsLower ? pi<size : pi>0;
52 IsLower ? pi+=PanelWidth : pi-=PanelWidth)
54 Index actualPanelWidth = (std::min)(IsLower ? size - pi : pi, PanelWidth);
56 Index r = IsLower ? pi : size - pi;
62 Index startRow = IsLower ? pi : pi-actualPanelWidth;
63 Index startCol = IsLower ? 0 : pi;
65 general_matrix_vector_product<Index,LhsScalar,LhsMapper,RowMajor,Conjugate,RhsScalar,RhsMapper,false>::run(
67 LhsMapper(&lhs.coeffRef(startRow,startCol), lhsStride),
68 RhsMapper(rhs + startCol, 1),
73 for(Index k=0; k<actualPanelWidth; ++k)
75 Index i = IsLower ? pi+k : pi-k-1;
76 Index s = IsLower ? pi : i+1;
78 rhs[i] -= (cjLhs.row(i).segment(s,k).transpose().cwiseProduct(Map<
const Matrix<RhsScalar,Dynamic,1> >(rhs+s,k))).sum();
88 template<
typename LhsScalar,
typename RhsScalar,
typename Index,
int Mode,
bool Conjugate>
89 struct triangular_solve_vector<LhsScalar, RhsScalar, Index,
OnTheLeft, Mode, Conjugate,
ColMajor>
94 static void run(Index size,
const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs)
96 typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> > LhsMap;
97 const LhsMap lhs(_lhs,size,size,OuterStride<>(lhsStride));
98 typedef const_blas_data_mapper<LhsScalar,Index,ColMajor> LhsMapper;
99 typedef const_blas_data_mapper<RhsScalar,Index,ColMajor> RhsMapper;
100 typename internal::conditional<Conjugate,
101 const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>,LhsMap>,
104 static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;
106 for(Index pi=IsLower ? 0 : size;
107 IsLower ? pi<size : pi>0;
108 IsLower ? pi+=PanelWidth : pi-=PanelWidth)
110 Index actualPanelWidth = (std::min)(IsLower ? size - pi : pi, PanelWidth);
111 Index startBlock = IsLower ? pi : pi-actualPanelWidth;
112 Index endBlock = IsLower ? pi + actualPanelWidth : 0;
114 for(Index k=0; k<actualPanelWidth; ++k)
116 Index i = IsLower ? pi+k : pi-k-1;
118 rhs[i] /= cjLhs.coeff(i,i);
120 Index r = actualPanelWidth - k - 1;
121 Index s = IsLower ? i+1 : i-r;
123 Map<Matrix<RhsScalar,Dynamic,1> >(rhs+s,r) -= rhs[i] * cjLhs.col(i).segment(s,r);
125 Index r = IsLower ? size - endBlock : startBlock;
131 general_matrix_vector_product<Index,LhsScalar,LhsMapper,ColMajor,Conjugate,RhsScalar,RhsMapper,false>::run(
133 LhsMapper(&lhs.coeffRef(endBlock,startBlock), lhsStride),
134 RhsMapper(rhs+startBlock, 1),
135 rhs+endBlock, 1, RhsScalar(-1));
145 #endif // EIGEN_TRIANGULAR_SOLVER_VECTOR_H
Definition: Constants.h:314
Definition: Constants.h:196
Definition: Constants.h:327
Definition: Constants.h:198
Definition: Constants.h:200
Definition: Eigen_Colamd.h:54
Definition: Constants.h:312
Definition: Constants.h:325