25 typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,RowMajor>, 0,
OuterStride<> > LhsMap;
26 typedef Map<Matrix<RhsScalar,Dynamic,1> > RhsMap;
27 enum { IsLower = (Mode&Lower) ? 1 : 0 };
28 static void run(Index size, Index k,
const LhsScalar* _lhs, Index lhsStride, RhsScalar* _other)
31 RhsMap other(_other,size,1);
32 typename internal::conditional<
34 const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>,LhsMap>,
38 for(
int col=0 ; col<other.cols() ; ++col)
40 for(
int ii=0; ii<size; ++ii)
42 int i = IsLower ? ii : size-ii-1;
43 int actual_k = (std::min)(k,ii);
44 int actual_start = IsLower ? k-actual_k : 1;
47 other.coeffRef(i,col) -= cjLhs.row(i).segment(actual_start,actual_k).transpose()
48 .cwiseProduct(other.col(col).segment(IsLower ? i-actual_k : i+1,actual_k)).sum();
50 if((Mode&UnitDiag)==0)
51 other.coeffRef(i,col) /= cjLhs(i,IsLower ? k : 0);
61 typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,ColMajor>, 0,
OuterStride<> > LhsMap;
62 typedef Map<Matrix<RhsScalar,Dynamic,1> > RhsMap;
63 enum { IsLower = (Mode&Lower) ? 1 : 0 };
64 static void run(Index size, Index k,
const LhsScalar* _lhs, Index lhsStride, RhsScalar* _other)
67 RhsMap other(_other,size,1);
68 typename internal::conditional<
70 const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>,LhsMap>,
74 for(
int col=0 ; col<other.cols() ; ++col)
76 for(
int ii=0; ii<size; ++ii)
78 int i = IsLower ? ii : size-ii-1;
79 int actual_k = (std::min)(k,size-ii-1);
80 int actual_start = IsLower ? 1 : k-actual_k;
82 if((Mode&UnitDiag)==0)
83 other.coeffRef(i,col) /= cjLhs(IsLower ? 0 : k, i);
86 other.col(col).segment(IsLower ? i+1 : i-actual_k, actual_k)
87 -= other.coeff(i,col) * cjLhs.col(i).segment(actual_start,actual_k);